diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 1adaaa2cb..bb2356e3b 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2023.8.1 +current_version = 2023.8.3 tag = True commit = True parse = (?P\d+)\.(?P\d+)\.(?P\d+) diff --git a/.dockerignore b/.dockerignore index 72cdb7ebe..fc9a08793 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,6 +5,9 @@ htmlcov dist/** build/** build_docs/** -Dockerfile +*Dockerfile authentik/enterprise blueprints/local +.git +!gen-ts-api/node_modules +!gen-ts-api/dist/** diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index c13282ba0..9fc956c80 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -23,7 +23,7 @@ runs: - name: Setup node uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - name: Setup dependencies diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index 84e6f9f0c..d24a2a88d 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -33,7 +33,7 @@ jobs: - ruff runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: run job @@ -41,7 +41,7 @@ jobs: test-migrations: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: run migrations @@ -50,7 +50,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup authentik env @@ -91,7 +91,7 @@ jobs: - 12-alpine - 15-alpine steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup with: @@ -108,7 +108,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: Create k8s Kind Cluster @@ -144,7 +144,7 @@ jobs: - name: flows glob: tests/e2e/test_flows* steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: Setup e2e env (chrome, etc) @@ -186,28 +186,31 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - name: Login to Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 if: ${{ steps.ev.outputs.shouldBuild == 'true' }} with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - name: generate ts client + run: make gen-client-ts - name: Build Docker Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: + context: . secrets: | GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }} GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }} @@ -220,6 +223,8 @@ jobs: GIT_BUILD_HASH=${{ steps.ev.outputs.sha }} VERSION=${{ steps.ev.outputs.version }} VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }} + cache-from: type=gha + cache-to: type=gha,mode=max - name: Comment on PR if: github.event_name == 'pull_request' continue-on-error: true @@ -231,28 +236,31 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - name: Login to Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 if: ${{ steps.ev.outputs.shouldBuild == 'true' }} with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - name: generate ts client + run: make gen-client-ts - name: Build Docker Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: + context: . secrets: | GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }} GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }} @@ -266,3 +274,5 @@ jobs: VERSION=${{ steps.ev.outputs.version }} VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }} platforms: linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/ci-outpost.yml b/.github/workflows/ci-outpost.yml index 84f523f92..51d3a9b12 100644 --- a/.github/workflows/ci-outpost.yml +++ b/.github/workflows/ci-outpost.yml @@ -14,7 +14,7 @@ jobs: lint-golint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-go@v4 with: go-version-file: "go.mod" @@ -31,11 +31,11 @@ jobs: with: version: v1.52.2 args: --timeout 5000s --verbose - skip-pkg-cache: true + skip-cache: true test-unittest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-go@v4 with: go-version-file: "go.mod" @@ -64,20 +64,20 @@ jobs: - radius runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - name: Login to Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 if: ${{ steps.ev.outputs.shouldBuild == 'true' }} with: registry: ghcr.io @@ -86,7 +86,7 @@ jobs: - name: Generate API run: make gen-client-go - name: Build Docker Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: push: ${{ steps.ev.outputs.shouldBuild == 'true' }} tags: | @@ -99,6 +99,8 @@ jobs: VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }} platforms: linux/amd64,linux/arm64 context: . + cache-from: type=gha + cache-to: type=gha,mode=max build-binary: timeout-minutes: 120 needs: @@ -114,15 +116,15 @@ jobs: goos: [linux] goarch: [amd64, arm64] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - uses: actions/setup-go@v4 with: go-version-file: "go.mod" - - uses: actions/setup-node@v3.8.1 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - name: Generate API diff --git a/.github/workflows/ci-web.yml b/.github/workflows/ci-web.yml index b6da95d2d..6a23127a7 100644 --- a/.github/workflows/ci-web.yml +++ b/.github/workflows/ci-web.yml @@ -14,10 +14,10 @@ jobs: lint-eslint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - working-directory: web/ @@ -30,10 +30,10 @@ jobs: lint-build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - working-directory: web/ @@ -46,10 +46,10 @@ jobs: lint-prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - working-directory: web/ @@ -62,10 +62,10 @@ jobs: lint-lit-analyse: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - working-directory: web/ @@ -94,10 +94,10 @@ jobs: - ci-web-mark runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - working-directory: web/ diff --git a/.github/workflows/ci-website.yml b/.github/workflows/ci-website.yml index 38885d83b..0445b4703 100644 --- a/.github/workflows/ci-website.yml +++ b/.github/workflows/ci-website.yml @@ -14,10 +14,10 @@ jobs: lint-prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: website/package-lock.json - working-directory: website/ @@ -28,10 +28,10 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: website/package-lock.json - working-directory: website/ @@ -49,10 +49,10 @@ jobs: - build - build-docs-only steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3.8.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: website/package-lock.json - working-directory: website/ diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 71add7bde..5f1255f56 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -23,7 +23,7 @@ jobs: language: ["go", "javascript", "python"] steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: Initialize CodeQL diff --git a/.github/workflows/gha-cache-cleanup.yml b/.github/workflows/gha-cache-cleanup.yml index b2fa16407..178d00cac 100644 --- a/.github/workflows/gha-cache-cleanup.yml +++ b/.github/workflows/gha-cache-cleanup.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Cleanup run: | diff --git a/.github/workflows/ghcr-retention.yml b/.github/workflows/ghcr-retention.yml index b7dc6c447..8dc32f5f7 100644 --- a/.github/workflows/ghcr-retention.yml +++ b/.github/workflows/ghcr-retention.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/image-compress.yml b/.github/workflows/image-compress.yml index 48d93d639..02a18553b 100644 --- a/.github/workflows/image-compress.yml +++ b/.github/workflows/image-compress.yml @@ -29,11 +29,11 @@ jobs: github.event.pull_request.head.repo.full_name == github.repository) steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ steps.generate_token.outputs.token }} - name: Compress images diff --git a/.github/workflows/publish-source-docs.yml b/.github/workflows/publish-source-docs.yml index d6615a03f..036c4c04b 100644 --- a/.github/workflows/publish-source-docs.yml +++ b/.github/workflows/publish-source-docs.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 120 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup authentik env uses: ./.github/actions/setup - name: generate docs diff --git a/.github/workflows/release-next-branch.yml b/.github/workflows/release-next-branch.yml index 7a75a82a5..233398e95 100644 --- a/.github/workflows/release-next-branch.yml +++ b/.github/workflows/release-next-branch.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest environment: internal-production steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: main - run: | diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 032380ee7..7860ccac0 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -8,28 +8,31 @@ jobs: build-server: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev - name: Docker Login Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - name: make empty ts client + run: mkdir -p ./gen-ts-client - name: Build Docker Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: + context: . push: ${{ github.event_name == 'release' }} secrets: | GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }} @@ -55,30 +58,30 @@ jobs: - ldap - radius steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-go@v4 with: go-version-file: "go.mod" - name: Set up QEMU - uses: docker/setup-qemu-action@v2.2.0 + uses: docker/setup-qemu-action@v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev - name: Docker Login Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build Docker Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: push: ${{ github.event_name == 'release' }} tags: | @@ -106,13 +109,13 @@ jobs: goos: [linux, darwin] goarch: [amd64, arm64] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-go@v4 with: go-version-file: "go.mod" - - uses: actions/setup-node@v3.8.1 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" cache: "npm" cache-dependency-path: web/package-lock.json - name: Build web @@ -141,7 +144,7 @@ jobs: - build-outpost-binary runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run test suite in final docker images run: | echo "PG_PASS=$(openssl rand -base64 32)" >> .env @@ -157,7 +160,7 @@ jobs: - build-outpost-binary runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: prepare variables uses: ./.github/actions/docker-push-variables id: ev diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index 7598c58f1..21e5a0c44 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -10,7 +10,7 @@ jobs: name: Create Release from Tag runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Pre-release test run: | echo "PG_PASS=$(openssl rand -base64 32)" >> .env @@ -23,7 +23,7 @@ jobs: docker-compose start postgresql redis docker-compose run -u root server test-all - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/repo-stale.yml b/.github/workflows/repo-stale.yml index c52997a33..d7b9b66b4 100644 --- a/.github/workflows/repo-stale.yml +++ b/.github/workflows/repo-stale.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/translation-compile.yml b/.github/workflows/translation-compile.yml index 8fa655213..e6d075af7 100644 --- a/.github/workflows/translation-compile.yml +++ b/.github/workflows/translation-compile.yml @@ -16,11 +16,11 @@ jobs: runs-on: ubuntu-latest steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ steps.generate_token.outputs.token }} - name: Setup authentik env diff --git a/.github/workflows/translation-rename.yml b/.github/workflows/translation-rename.yml index 2de0382c7..b2c947bda 100644 --- a/.github/workflows/translation-rename.yml +++ b/.github/workflows/translation-rename.yml @@ -1,4 +1,5 @@ # Rename transifex pull requests to have a correct naming +# Also enables auto squash-merge name: authentik-translation-transifex-rename on: @@ -11,7 +12,7 @@ jobs: if: ${{ github.event.pull_request.user.login == 'transifex-integration[bot]'}} steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -37,3 +38,8 @@ jobs: -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/${GITHUB_REPOSITORY}/pulls/${{ github.event.pull_request.number }} \ -d "{\"title\":\"translate: ${{ steps.title.outputs.title }}\"}" + - uses: peter-evans/enable-pull-request-automerge@v3 + with: + token: ${{ steps.generate_token.outputs.token }} + pull-request-number: ${{ github.event.pull_request.number }} + merge-method: squash diff --git a/.github/workflows/web-api-publish.yml b/.github/workflows/web-api-publish.yml index 1f6ffbb4a..0f3fd057a 100644 --- a/.github/workflows/web-api-publish.yml +++ b/.github/workflows/web-api-publish.yml @@ -10,16 +10,16 @@ jobs: runs-on: ubuntu-latest steps: - id: generate_token - uses: tibdex/github-app-token@v1 + uses: tibdex/github-app-token@v2 with: app_id: ${{ secrets.GH_APP_ID }} private_key: ${{ secrets.GH_APP_PRIVATE_KEY }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{ steps.generate_token.outputs.token }} - - uses: actions/setup-node@v3.8.1 + - uses: actions/setup-node@v3 with: - node-version: "20" + node-version: "20.5" registry-url: "https://registry.npmjs.org" - name: Generate API Client run: make gen-client-ts diff --git a/CODEOWNERS b/CODEOWNERS index d9fbd031e..284ac23da 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,23 @@ -* @goauthentik/core -website/docs/security/** @goauthentik/security +# Fallback +* @goauthentik/backend @goauthentik/frontend +# Backend +authentik/ @goauthentik/backend +blueprints/ @goauthentik/backend +cmd/ @goauthentik/backend +internal/ @goauthentik/backend +lifecycle/ @goauthentik/backend +schemas/ @goauthentik/backend +scripts/ @goauthentik/backend +tests/ @goauthentik/backend +# Infrastructure +.github/ @goauthentik/infrastructure +Dockerfile @goauthentik/infrastructure +*Dockerfile @goauthentik/infrastructure +.dockerignore @goauthentik/infrastructure +docker-compose.yml @goauthentik/infrastructure +# Web +web/ @goauthentik/frontend +# Docs & Website +website/ @goauthentik/docs +# Security +website/docs/security/ @goauthentik/security diff --git a/Dockerfile b/Dockerfile index c78b4a96a..a6688fbc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,53 +1,65 @@ # Stage 1: Build website -FROM --platform=${BUILDPLATFORM} docker.io/node:20 as website-builder +FROM --platform=${BUILDPLATFORM} docker.io/node:20.5 as website-builder + +ENV NODE_ENV=production + +WORKDIR /work/website + +RUN --mount=type=bind,target=/work/website/package.json,src=./website/package.json \ + --mount=type=bind,target=/work/website/package-lock.json,src=./website/package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci --include=dev COPY ./website /work/website/ COPY ./blueprints /work/blueprints/ COPY ./SECURITY.md /work/ -ENV NODE_ENV=production -WORKDIR /work/website -RUN npm ci --include=dev && npm run build-docs-only +RUN npm run build-docs-only # Stage 2: Build webui -FROM --platform=${BUILDPLATFORM} docker.io/node:20 as web-builder +FROM --platform=${BUILDPLATFORM} docker.io/node:20.5 as web-builder + +ENV NODE_ENV=production + +WORKDIR /work/web + +RUN --mount=type=bind,target=/work/web/package.json,src=./web/package.json \ + --mount=type=bind,target=/work/web/package-lock.json,src=./web/package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci --include=dev COPY ./web /work/web/ COPY ./website /work/website/ +COPY ./gen-ts-api /work/web/node_modules/@goauthentik/api -ENV NODE_ENV=production -WORKDIR /work/web -RUN npm ci --include=dev && npm run build +RUN npm run build -# Stage 3: Poetry to requirements.txt export -FROM docker.io/python:3.11.5-slim-bookworm AS poetry-locker +# Stage 3: Build go proxy +FROM docker.io/golang:1.21.1-bookworm AS go-builder -WORKDIR /work -COPY ./pyproject.toml /work -COPY ./poetry.lock /work +WORKDIR /go/src/goauthentik.io -RUN pip install --no-cache-dir poetry && \ - poetry export -f requirements.txt --output requirements.txt && \ - poetry export -f requirements.txt --dev --output requirements-dev.txt +RUN --mount=type=bind,target=/go/src/goauthentik.io/go.mod,src=./go.mod \ + --mount=type=bind,target=/go/src/goauthentik.io/go.sum,src=./go.sum \ + --mount=type=cache,target=/go/pkg/mod \ + go mod download -# Stage 4: Build go proxy -FROM docker.io/golang:1.21.0-bookworm AS go-builder +COPY ./cmd /go/src/goauthentik.io/cmd +COPY ./authentik/lib /go/src/goauthentik.io/authentik/lib +COPY ./web/static.go /go/src/goauthentik.io/web/static.go +COPY --from=web-builder /work/web/robots.txt /go/src/goauthentik.io/web/robots.txt +COPY --from=web-builder /work/web/security.txt /go/src/goauthentik.io/web/security.txt +COPY ./internal /go/src/goauthentik.io/internal +COPY ./go.mod /go/src/goauthentik.io/go.mod +COPY ./go.sum /go/src/goauthentik.io/go.sum -WORKDIR /work +ENV CGO_ENABLED=0 -COPY --from=web-builder /work/web/robots.txt /work/web/robots.txt -COPY --from=web-builder /work/web/security.txt /work/web/security.txt +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o /go/authentik ./cmd/server -COPY ./cmd /work/cmd -COPY ./authentik/lib /work/authentik/lib -COPY ./web/static.go /work/web/static.go -COPY ./internal /work/internal -COPY ./go.mod /work/go.mod -COPY ./go.sum /work/go.sum - -RUN go build -o /work/bin/authentik ./cmd/server/ - -# Stage 5: MaxMind GeoIP +# Stage 4: MaxMind GeoIP FROM ghcr.io/maxmind/geoipupdate:v6.0 as geoip ENV GEOIPUPDATE_EDITION_IDS="GeoLite2-City" @@ -61,6 +73,29 @@ RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \ mkdir -p /usr/share/GeoIP && \ /bin/sh -c "/usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0" +# Stage 5: Python dependencies +FROM docker.io/python:3.11.5-bookworm AS python-deps + +WORKDIR /ak-root/poetry + +ENV VENV_PATH="/ak-root/venv" \ + POETRY_VIRTUALENVS_CREATE=false \ + PATH="/ak-root/venv/bin:$PATH" + +RUN --mount=type=cache,target=/var/cache/apt \ + apt-get update && \ + # Required for installing pip packages + apt-get install -y --no-install-recommends build-essential pkg-config libxmlsec1-dev zlib1g-dev libpq-dev + +RUN --mount=type=bind,target=./pyproject.toml,src=./pyproject.toml \ + --mount=type=bind,target=./poetry.lock,src=./poetry.lock \ + --mount=type=cache,target=/root/.cache/pip \ + --mount=type=cache,target=/root/.cache/pypoetry \ + python -m venv /ak-root/venv/ && \ + pip3 install --upgrade pip && \ + pip3 install poetry && \ + poetry install --only=main --no-ansi --no-interaction + # Stage 6: Run FROM docker.io/python:3.11.5-slim-bookworm AS final-image @@ -76,46 +111,45 @@ LABEL org.opencontainers.image.revision ${GIT_BUILD_HASH} WORKDIR / -COPY --from=poetry-locker /work/requirements.txt / -COPY --from=poetry-locker /work/requirements-dev.txt / -COPY --from=geoip /usr/share/GeoIP /geoip - +# We cannot cache this layer otherwise we'll end up with a bigger image RUN apt-get update && \ - # Required for installing pip packages - apt-get install -y --no-install-recommends build-essential pkg-config libxmlsec1-dev zlib1g-dev libpq-dev python3-dev && \ # Required for runtime apt-get install -y --no-install-recommends libpq5 openssl libxmlsec1-openssl libmaxminddb0 && \ # Required for bootstrap & healtcheck apt-get install -y --no-install-recommends runit && \ - pip install --no-cache-dir -r /requirements.txt && \ - apt-get remove --purge -y build-essential pkg-config libxmlsec1-dev libpq-dev python3-dev && \ - apt-get autoremove --purge -y && \ apt-get clean && \ rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/ && \ adduser --system --no-create-home --uid 1000 --group --home /authentik authentik && \ mkdir -p /certs /media /blueprints && \ mkdir -p /authentik/.ssh && \ - chown authentik:authentik /certs /media /authentik/.ssh + mkdir -p /ak-root && \ + chown authentik:authentik /certs /media /authentik/.ssh /ak-root COPY ./authentik/ /authentik COPY ./pyproject.toml / +COPY ./poetry.lock / COPY ./schemas /schemas COPY ./locale /locale COPY ./tests /tests COPY ./manage.py / COPY ./blueprints /blueprints COPY ./lifecycle/ /lifecycle -COPY --from=go-builder /work/bin/authentik /bin/authentik +COPY --from=go-builder /go/authentik /bin/authentik +COPY --from=python-deps /ak-root/venv /ak-root/venv COPY --from=web-builder /work/web/dist/ /web/dist/ COPY --from=web-builder /work/web/authentik/ /web/authentik/ COPY --from=website-builder /work/website/help/ /website/help/ +COPY --from=geoip /usr/share/GeoIP /geoip USER 1000 -ENV TMPDIR /dev/shm/ -ENV PYTHONUNBUFFERED 1 -ENV PATH "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/lifecycle" +ENV TMPDIR=/dev/shm/ \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PATH="/ak-root/venv/bin:$PATH" \ + VENV_PATH="/ak-root/venv" \ + POETRY_VIRTUALENVS_CREATE=false HEALTHCHECK --interval=30s --timeout=30s --start-period=60s --retries=3 CMD [ "/lifecycle/ak", "healthcheck" ] -ENTRYPOINT [ "/usr/local/bin/dumb-init", "--", "/lifecycle/ak" ] +ENTRYPOINT [ "dumb-init", "--", "/lifecycle/ak" ] diff --git a/Makefile b/Makefile index fb08cc604..4750b17ef 100644 --- a/Makefile +++ b/Makefile @@ -174,8 +174,19 @@ website-build: website-watch: cd website && npm run watch +######################### +## Docker +######################### + +docker: + DOCKER_BUILDKIT=1 docker build . --progress plain --tag authentik:test + +######################### +## CI +######################### # These targets are use by GitHub actions to allow usage of matrix # which makes the YAML File a lot smaller + ci--meta-debug: python -V node --version diff --git a/authentik/__init__.py b/authentik/__init__.py index f36d231ff..a08d2bfe9 100644 --- a/authentik/__init__.py +++ b/authentik/__init__.py @@ -2,7 +2,7 @@ from os import environ from typing import Optional -__version__ = "2023.8.1" +__version__ = "2023.8.3" ENV_GIT_HASH_KEY = "GIT_BUILD_HASH" diff --git a/authentik/blueprints/api.py b/authentik/blueprints/api.py index d13a30812..9fac62c72 100644 --- a/authentik/blueprints/api.py +++ b/authentik/blueprints/api.py @@ -12,7 +12,7 @@ from rest_framework.viewsets import ModelViewSet from authentik.api.decorators import permission_required from authentik.blueprints.models import BlueprintInstance -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.blueprints.v1.oci import OCI_PREFIX from authentik.blueprints.v1.tasks import apply_blueprint, blueprints_find_dict from authentik.core.api.used_by import UsedByMixin @@ -49,7 +49,7 @@ class BlueprintInstanceSerializer(ModelSerializer): if content == "": return content context = self.instance.context if self.instance else {} - valid, logs = StringImporter(content, context).validate() + valid, logs = Importer.from_string(content, context).validate() if not valid: text_logs = "\n".join([x["event"] for x in logs]) raise ValidationError(_("Failed to validate blueprint: %(logs)s" % {"logs": text_logs})) diff --git a/authentik/blueprints/management/commands/apply_blueprint.py b/authentik/blueprints/management/commands/apply_blueprint.py index 427c13bb6..acc9ffbec 100644 --- a/authentik/blueprints/management/commands/apply_blueprint.py +++ b/authentik/blueprints/management/commands/apply_blueprint.py @@ -5,7 +5,7 @@ from django.core.management.base import BaseCommand, no_translations from structlog.stdlib import get_logger from authentik.blueprints.models import BlueprintInstance -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer LOGGER = get_logger() @@ -18,7 +18,7 @@ class Command(BaseCommand): """Apply all blueprints in order, abort when one fails to import""" for blueprint_path in options.get("blueprints", []): content = BlueprintInstance(path=blueprint_path).retrieve() - importer = StringImporter(content) + importer = Importer.from_string(content) valid, _ = importer.validate() if not valid: self.stderr.write("blueprint invalid") diff --git a/authentik/blueprints/tests/__init__.py b/authentik/blueprints/tests/__init__.py index 06a3d04bf..138e02242 100644 --- a/authentik/blueprints/tests/__init__.py +++ b/authentik/blueprints/tests/__init__.py @@ -11,7 +11,7 @@ from authentik.blueprints.models import BlueprintInstance def apply_blueprint(*files: str): """Apply blueprint before test""" - from authentik.blueprints.v1.importer import StringImporter + from authentik.blueprints.v1.importer import Importer def wrapper_outer(func: Callable): """Apply blueprint before test""" @@ -20,7 +20,7 @@ def apply_blueprint(*files: str): def wrapper(*args, **kwargs): for file in files: content = BlueprintInstance(path=file).retrieve() - StringImporter(content).apply() + Importer.from_string(content).apply() return func(*args, **kwargs) return wrapper diff --git a/authentik/blueprints/tests/test_packaged.py b/authentik/blueprints/tests/test_packaged.py index 5edf7afc3..c1e65e527 100644 --- a/authentik/blueprints/tests/test_packaged.py +++ b/authentik/blueprints/tests/test_packaged.py @@ -6,7 +6,7 @@ from django.test import TransactionTestCase from authentik.blueprints.models import BlueprintInstance from authentik.blueprints.tests import apply_blueprint -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.tenants.models import Tenant @@ -25,7 +25,7 @@ def blueprint_tester(file_name: Path) -> Callable: def tester(self: TestPackaged): base = Path("blueprints/") rel_path = Path(file_name).relative_to(base) - importer = StringImporter(BlueprintInstance(path=str(rel_path)).retrieve()) + importer = Importer.from_string(BlueprintInstance(path=str(rel_path)).retrieve()) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) diff --git a/authentik/blueprints/tests/test_v1.py b/authentik/blueprints/tests/test_v1.py index 73ec9d553..f7f53f780 100644 --- a/authentik/blueprints/tests/test_v1.py +++ b/authentik/blueprints/tests/test_v1.py @@ -4,7 +4,7 @@ from os import environ from django.test import TransactionTestCase from authentik.blueprints.v1.exporter import FlowExporter -from authentik.blueprints.v1.importer import StringImporter, transaction_rollback +from authentik.blueprints.v1.importer import Importer, transaction_rollback from authentik.core.models import Group from authentik.flows.models import Flow, FlowDesignation, FlowStageBinding from authentik.lib.generators import generate_id @@ -21,14 +21,14 @@ class TestBlueprintsV1(TransactionTestCase): def test_blueprint_invalid_format(self): """Test blueprint with invalid format""" - importer = StringImporter('{"version": 3}') + importer = Importer.from_string('{"version": 3}') self.assertFalse(importer.validate()[0]) - importer = StringImporter( + importer = Importer.from_string( '{"version": 1,"entries":[{"identifiers":{},"attrs":{},' '"model": "authentik_core.User"}]}' ) self.assertFalse(importer.validate()[0]) - importer = StringImporter( + importer = Importer.from_string( '{"version": 1, "entries": [{"attrs": {"name": "test"}, ' '"identifiers": {}, ' '"model": "authentik_core.Group"}]}' @@ -54,7 +54,7 @@ class TestBlueprintsV1(TransactionTestCase): }, ) - importer = StringImporter( + importer = Importer.from_string( '{"version": 1, "entries": [{"attrs": {"name": "test999", "attributes": ' '{"key": ["updated_value"]}}, "identifiers": {"attributes": {"other_key": ' '["other_value"]}}, "model": "authentik_core.Group"}]}' @@ -103,7 +103,7 @@ class TestBlueprintsV1(TransactionTestCase): self.assertEqual(len(export.entries), 3) export_yaml = exporter.export_to_string() - importer = StringImporter(export_yaml) + importer = Importer.from_string(export_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) @@ -113,14 +113,14 @@ class TestBlueprintsV1(TransactionTestCase): """Test export and import it twice""" count_initial = Prompt.objects.filter(field_key="username").count() - importer = StringImporter(load_fixture("fixtures/static_prompt_export.yaml")) + importer = Importer.from_string(load_fixture("fixtures/static_prompt_export.yaml")) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) count_before = Prompt.objects.filter(field_key="username").count() self.assertEqual(count_initial + 1, count_before) - importer = StringImporter(load_fixture("fixtures/static_prompt_export.yaml")) + importer = Importer.from_string(load_fixture("fixtures/static_prompt_export.yaml")) self.assertTrue(importer.apply()) self.assertEqual(Prompt.objects.filter(field_key="username").count(), count_before) @@ -130,7 +130,7 @@ class TestBlueprintsV1(TransactionTestCase): ExpressionPolicy.objects.filter(name="foo-bar-baz-qux").delete() Group.objects.filter(name="test").delete() environ["foo"] = generate_id() - importer = StringImporter(load_fixture("fixtures/tags.yaml"), {"bar": "baz"}) + importer = Importer.from_string(load_fixture("fixtures/tags.yaml"), {"bar": "baz"}) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) policy = ExpressionPolicy.objects.filter(name="foo-bar-baz-qux").first() @@ -248,7 +248,7 @@ class TestBlueprintsV1(TransactionTestCase): exporter = FlowExporter(flow) export_yaml = exporter.export_to_string() - importer = StringImporter(export_yaml) + importer = Importer.from_string(export_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) self.assertTrue(UserLoginStage.objects.filter(name=stage_name).exists()) @@ -297,7 +297,7 @@ class TestBlueprintsV1(TransactionTestCase): exporter = FlowExporter(flow) export_yaml = exporter.export_to_string() - importer = StringImporter(export_yaml) + importer = Importer.from_string(export_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) diff --git a/authentik/blueprints/tests/test_v1_conditional_fields.py b/authentik/blueprints/tests/test_v1_conditional_fields.py index 309bd38df..4b7cb4591 100644 --- a/authentik/blueprints/tests/test_v1_conditional_fields.py +++ b/authentik/blueprints/tests/test_v1_conditional_fields.py @@ -1,7 +1,7 @@ """Test blueprints v1""" from django.test import TransactionTestCase -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.core.models import Application, Token, User from authentik.core.tests.utils import create_test_admin_user from authentik.flows.models import Flow @@ -18,7 +18,7 @@ class TestBlueprintsV1ConditionalFields(TransactionTestCase): self.uid = generate_id() import_yaml = load_fixture("fixtures/conditional_fields.yaml", uid=self.uid, user=user.pk) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) diff --git a/authentik/blueprints/tests/test_v1_conditions.py b/authentik/blueprints/tests/test_v1_conditions.py index 57217c49e..dd633a22a 100644 --- a/authentik/blueprints/tests/test_v1_conditions.py +++ b/authentik/blueprints/tests/test_v1_conditions.py @@ -1,7 +1,7 @@ """Test blueprints v1""" from django.test import TransactionTestCase -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.flows.models import Flow from authentik.lib.generators import generate_id from authentik.lib.tests.utils import load_fixture @@ -18,7 +18,7 @@ class TestBlueprintsV1Conditions(TransactionTestCase): "fixtures/conditions_fulfilled.yaml", id1=flow_slug1, id2=flow_slug2 ) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) # Ensure objects exist @@ -35,7 +35,7 @@ class TestBlueprintsV1Conditions(TransactionTestCase): "fixtures/conditions_not_fulfilled.yaml", id1=flow_slug1, id2=flow_slug2 ) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) # Ensure objects do not exist diff --git a/authentik/blueprints/tests/test_v1_state.py b/authentik/blueprints/tests/test_v1_state.py index a14b7f5e8..ad12c239c 100644 --- a/authentik/blueprints/tests/test_v1_state.py +++ b/authentik/blueprints/tests/test_v1_state.py @@ -1,7 +1,7 @@ """Test blueprints v1""" from django.test import TransactionTestCase -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.flows.models import Flow from authentik.lib.generators import generate_id from authentik.lib.tests.utils import load_fixture @@ -15,7 +15,7 @@ class TestBlueprintsV1State(TransactionTestCase): flow_slug = generate_id() import_yaml = load_fixture("fixtures/state_present.yaml", id=flow_slug) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) # Ensure object exists @@ -30,7 +30,7 @@ class TestBlueprintsV1State(TransactionTestCase): self.assertEqual(flow.title, "bar") # Ensure importer updates it - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) flow: Flow = Flow.objects.filter(slug=flow_slug).first() @@ -41,7 +41,7 @@ class TestBlueprintsV1State(TransactionTestCase): flow_slug = generate_id() import_yaml = load_fixture("fixtures/state_created.yaml", id=flow_slug) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) # Ensure object exists @@ -56,7 +56,7 @@ class TestBlueprintsV1State(TransactionTestCase): self.assertEqual(flow.title, "bar") # Ensure importer doesn't update it - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) flow: Flow = Flow.objects.filter(slug=flow_slug).first() @@ -67,7 +67,7 @@ class TestBlueprintsV1State(TransactionTestCase): flow_slug = generate_id() import_yaml = load_fixture("fixtures/state_created.yaml", id=flow_slug) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) # Ensure object exists @@ -75,7 +75,7 @@ class TestBlueprintsV1State(TransactionTestCase): self.assertEqual(flow.slug, flow_slug) import_yaml = load_fixture("fixtures/state_absent.yaml", id=flow_slug) - importer = StringImporter(import_yaml) + importer = Importer.from_string(import_yaml) self.assertTrue(importer.validate()[0]) self.assertTrue(importer.apply()) flow: Flow = Flow.objects.filter(slug=flow_slug).first() diff --git a/authentik/blueprints/v1/common.py b/authentik/blueprints/v1/common.py index b4b2a7f26..6d41ac988 100644 --- a/authentik/blueprints/v1/common.py +++ b/authentik/blueprints/v1/common.py @@ -12,6 +12,7 @@ from uuid import UUID from deepmerge import always_merger from django.apps import apps from django.db.models import Model, Q +from rest_framework.exceptions import ValidationError from rest_framework.fields import Field from rest_framework.serializers import Serializer from yaml import SafeDumper, SafeLoader, ScalarNode, SequenceNode @@ -207,8 +208,8 @@ class KeyOf(YAMLTag): ): return _entry._state.instance.pbm_uuid return _entry._state.instance.pk - raise EntryInvalidError( - f"KeyOf: failed to find entry with `id` of `{self.id_from}` and a model instance" + raise EntryInvalidError.from_entry( + f"KeyOf: failed to find entry with `id` of `{self.id_from}` and a model instance", entry ) @@ -279,7 +280,7 @@ class Format(YAMLTag): try: return self.format_string % tuple(args) except TypeError as exc: - raise EntryInvalidError(exc) + raise EntryInvalidError.from_entry(exc, entry) class Find(YAMLTag): @@ -356,13 +357,15 @@ class Condition(YAMLTag): args.append(arg) if not args: - raise EntryInvalidError("At least one value is required after mode selection.") + raise EntryInvalidError.from_entry( + "At least one value is required after mode selection.", entry + ) try: comparator = self._COMPARATORS[self.mode.upper()] return comparator(tuple(bool(x) for x in args)) except (TypeError, KeyError) as exc: - raise EntryInvalidError(exc) + raise EntryInvalidError.from_entry(exc, entry) class If(YAMLTag): @@ -394,7 +397,7 @@ class If(YAMLTag): blueprint, ) except TypeError as exc: - raise EntryInvalidError(exc) + raise EntryInvalidError.from_entry(exc, entry) class Enumerate(YAMLTag, YAMLTagContext): @@ -426,9 +429,10 @@ class Enumerate(YAMLTag, YAMLTagContext): def resolve(self, entry: BlueprintEntry, blueprint: Blueprint) -> Any: if isinstance(self.iterable, EnumeratedItem) and self.iterable.depth == 0: - raise EntryInvalidError( + raise EntryInvalidError.from_entry( f"{self.__class__.__name__} tag's iterable references this tag's context. " - "This is a noop. Check you are setting depth bigger than 0." + "This is a noop. Check you are setting depth bigger than 0.", + entry, ) if isinstance(self.iterable, YAMLTag): @@ -437,9 +441,10 @@ class Enumerate(YAMLTag, YAMLTagContext): iterable = self.iterable if not isinstance(iterable, Iterable): - raise EntryInvalidError( + raise EntryInvalidError.from_entry( f"{self.__class__.__name__}'s iterable must be an iterable " - "such as a sequence or a mapping" + "such as a sequence or a mapping", + entry, ) if isinstance(iterable, Mapping): @@ -450,7 +455,7 @@ class Enumerate(YAMLTag, YAMLTagContext): try: output_class, add_fn = self._OUTPUT_BODIES[self.output_body.upper()] except KeyError as exc: - raise EntryInvalidError(exc) + raise EntryInvalidError.from_entry(exc, entry) result = output_class() @@ -462,8 +467,8 @@ class Enumerate(YAMLTag, YAMLTagContext): resolved_body = entry.tag_resolver(self.item_body, blueprint) result = add_fn(result, resolved_body) if not isinstance(result, output_class): - raise EntryInvalidError( - f"Invalid {self.__class__.__name__} item found: {resolved_body}" + raise EntryInvalidError.from_entry( + f"Invalid {self.__class__.__name__} item found: {resolved_body}", entry ) finally: self.__current_context = tuple() @@ -490,12 +495,13 @@ class EnumeratedItem(YAMLTag): ) except ValueError as exc: if self.depth == 0: - raise EntryInvalidError( + raise EntryInvalidError.from_entry( f"{self.__class__.__name__} tags are only usable " - f"inside an {Enumerate.__name__} tag" + f"inside an {Enumerate.__name__} tag", + entry, ) - raise EntryInvalidError(f"{self.__class__.__name__} tag: {exc}") + raise EntryInvalidError.from_entry(f"{self.__class__.__name__} tag: {exc}", entry) return context_tag.get_context(entry, blueprint) @@ -509,7 +515,7 @@ class Index(EnumeratedItem): try: return context[0] except IndexError: # pragma: no cover - raise EntryInvalidError(f"Empty/invalid context: {context}") + raise EntryInvalidError.from_entry(f"Empty/invalid context: {context}", entry) class Value(EnumeratedItem): @@ -521,7 +527,7 @@ class Value(EnumeratedItem): try: return context[1] except IndexError: # pragma: no cover - raise EntryInvalidError(f"Empty/invalid context: {context}") + raise EntryInvalidError.from_entry(f"Empty/invalid context: {context}", entry) class BlueprintDumper(SafeDumper): @@ -575,8 +581,26 @@ class BlueprintLoader(SafeLoader): class EntryInvalidError(SentryIgnoredException): """Error raised when an entry is invalid""" - serializer_errors: Optional[dict] + entry_model: Optional[str] + entry_id: Optional[str] + validation_error: Optional[ValidationError] - def __init__(self, *args: object, serializer_errors: Optional[dict] = None) -> None: + def __init__(self, *args: object, validation_error: Optional[ValidationError] = None) -> None: super().__init__(*args) - self.serializer_errors = serializer_errors + self.entry_model = None + self.entry_id = None + self.validation_error = validation_error + + @staticmethod + def from_entry( + msg_or_exc: str | Exception, entry: BlueprintEntry, *args, **kwargs + ) -> "EntryInvalidError": + """Create EntryInvalidError with the context of an entry""" + error = EntryInvalidError(msg_or_exc, *args, **kwargs) + if isinstance(msg_or_exc, ValidationError): + error.validation_error = msg_or_exc + # Make sure the model and id are strings, depending where the error happens + # they might still be YAMLTag instances + error.entry_model = str(entry.model) + error.entry_id = str(entry.id) + return error diff --git a/authentik/blueprints/v1/importer.py b/authentik/blueprints/v1/importer.py index 8ce722f4a..76c667c25 100644 --- a/authentik/blueprints/v1/importer.py +++ b/authentik/blueprints/v1/importer.py @@ -8,9 +8,9 @@ from dacite.core import from_dict from dacite.exceptions import DaciteError from deepmerge import always_merger from django.core.exceptions import FieldError -from django.db import transaction from django.db.models import Model from django.db.models.query_utils import Q +from django.db.transaction import atomic from django.db.utils import IntegrityError from rest_framework.exceptions import ValidationError from rest_framework.serializers import BaseSerializer, Serializer @@ -38,6 +38,7 @@ from authentik.core.models import ( from authentik.events.utils import cleanse_dict from authentik.flows.models import FlowToken, Stage from authentik.lib.models import SerializerModel +from authentik.lib.sentry import SentryIgnoredException from authentik.outposts.models import OutpostServiceConnection from authentik.policies.models import Policy, PolicyBindingModel @@ -72,18 +73,23 @@ def is_model_allowed(model: type[Model]) -> bool: return model not in excluded_models and issubclass(model, (SerializerModel, BaseMetaModel)) +class DoRollback(SentryIgnoredException): + """Exception to trigger a rollback""" + + @contextmanager def transaction_rollback(): """Enters an atomic transaction and always triggers a rollback at the end of the block.""" - atomic = transaction.atomic() - # pylint: disable=unnecessary-dunder-call - atomic.__enter__() - yield - atomic.__exit__(IntegrityError, None, None) + try: + with atomic(): + yield + raise DoRollback() + except DoRollback: + pass class Importer: - """Import Blueprint from YAML""" + """Import Blueprint from raw dict or YAML/JSON""" logger: BoundLogger _import: Blueprint @@ -98,6 +104,18 @@ class Importer: always_merger.merge(ctx, context) self._import.context = ctx + @staticmethod + def from_string(yaml_input: str, context: dict | None = None) -> "Importer": + """Parse YAML string and create blueprint importer from it""" + import_dict = load(yaml_input, BlueprintLoader) + try: + _import = from_dict( + Blueprint, import_dict, config=Config(cast=[BlueprintEntryDesiredState]) + ) + except DaciteError as exc: + raise EntryInvalidError from exc + return Importer(_import, context) + @property def blueprint(self) -> Blueprint: """Get imported blueprint""" @@ -155,7 +173,7 @@ class Importer: model: type[SerializerModel] = registry.get_model(model_app_label, model_name) # Don't use isinstance since we don't want to check for inheritance if not is_model_allowed(model): - raise EntryInvalidError(f"Model {model} not allowed") + raise EntryInvalidError.from_entry(f"Model {model} not allowed", entry) if issubclass(model, BaseMetaModel): serializer_class: type[Serializer] = model.serializer() serializer = serializer_class( @@ -167,8 +185,10 @@ class Importer: try: serializer.is_valid(raise_exception=True) except ValidationError as exc: - raise EntryInvalidError( - f"Serializer errors {serializer.errors}", serializer_errors=serializer.errors + raise EntryInvalidError.from_entry( + f"Serializer errors {serializer.errors}", + validation_error=exc, + entry=entry, ) from exc return serializer @@ -185,12 +205,12 @@ class Importer: query = self.__query_from_identifier(updated_identifiers) if not query: - raise EntryInvalidError("No or invalid identifiers") + raise EntryInvalidError.from_entry("No or invalid identifiers", entry) try: existing_models = model.objects.filter(query) except FieldError as exc: - raise EntryInvalidError(f"Invalid identifier field: {exc}") from exc + raise EntryInvalidError.from_entry(f"Invalid identifier field: {exc}", entry) from exc serializer_kwargs = {} model_instance = existing_models.first() @@ -204,11 +224,12 @@ class Importer: serializer_kwargs["instance"] = model_instance serializer_kwargs["partial"] = True elif model_instance and entry.state == BlueprintEntryDesiredState.MUST_CREATED: - raise EntryInvalidError( + raise EntryInvalidError.from_entry( ( - f"state is set to {BlueprintEntryDesiredState.MUST_CREATED}" - " and object exists already" - ) + f"state is set to {BlueprintEntryDesiredState.MUST_CREATED} " + "and object exists already", + ), + entry, ) else: self.logger.debug( @@ -224,7 +245,7 @@ class Importer: try: full_data = self.__update_pks_for_attrs(entry.get_attrs(self._import)) except ValueError as exc: - raise EntryInvalidError(exc) from exc + raise EntryInvalidError.from_entry(exc, entry) from exc always_merger.merge(full_data, updated_identifiers) serializer_kwargs["data"] = full_data @@ -237,15 +258,17 @@ class Importer: try: serializer.is_valid(raise_exception=True) except ValidationError as exc: - raise EntryInvalidError( - f"Serializer errors {serializer.errors}", serializer_errors=serializer.errors + raise EntryInvalidError.from_entry( + f"Serializer errors {serializer.errors}", + validation_error=exc, + entry=entry, ) from exc return serializer def apply(self) -> bool: """Apply (create/update) models yaml, in database transaction""" try: - with transaction.atomic(): + with atomic(): if not self._apply_models(): self.logger.debug("Reverting changes due to error") raise IntegrityError @@ -254,7 +277,7 @@ class Importer: self.logger.debug("Committing changes") return True - def _apply_models(self) -> bool: + def _apply_models(self, raise_errors=False) -> bool: """Apply (create/update) models yaml""" self.__pk_map = {} for entry in self._import.entries: @@ -274,6 +297,8 @@ class Importer: if entry.get_state(self._import) == BlueprintEntryDesiredState.ABSENT: continue self.logger.warning(f"entry invalid: {exc}", entry=entry, error=exc) + if raise_errors: + raise exc return False if not serializer: continue @@ -311,7 +336,7 @@ class Importer: self.logger.debug("entry to delete with no instance, skipping") return True - def validate(self) -> tuple[bool, list[EventDict]]: + def validate(self, raise_validation_errors=False) -> tuple[bool, list[EventDict]]: """Validate loaded blueprint export, ensure all models are allowed and serializers have no errors""" self.logger.debug("Starting blueprint import validation") @@ -323,7 +348,7 @@ class Importer: transaction_rollback(), capture_logs() as logs, ): - successful = self._apply_models() + successful = self._apply_models(raise_errors=raise_validation_errors) if not successful: self.logger.debug("Blueprint validation failed") for log in logs: @@ -331,17 +356,3 @@ class Importer: self.logger.debug("Finished blueprint import validation") self._import = orig_import return successful, logs - - -class StringImporter(Importer): - """Importer that also parses from string""" - - def __init__(self, yaml_input: str, context: dict | None = None): - import_dict = load(yaml_input, BlueprintLoader) - try: - _import = from_dict( - Blueprint, import_dict, config=Config(cast=[BlueprintEntryDesiredState]) - ) - except DaciteError as exc: - raise EntryInvalidError from exc - super().__init__(_import, context) diff --git a/authentik/blueprints/v1/tasks.py b/authentik/blueprints/v1/tasks.py index 40351dfc1..194a01748 100644 --- a/authentik/blueprints/v1/tasks.py +++ b/authentik/blueprints/v1/tasks.py @@ -26,7 +26,7 @@ from authentik.blueprints.models import ( BlueprintRetrievalFailed, ) from authentik.blueprints.v1.common import BlueprintLoader, BlueprintMetadata, EntryInvalidError -from authentik.blueprints.v1.importer import StringImporter +from authentik.blueprints.v1.importer import Importer from authentik.blueprints.v1.labels import LABEL_AUTHENTIK_INSTANTIATE from authentik.blueprints.v1.oci import OCI_PREFIX from authentik.events.monitored_tasks import ( @@ -190,7 +190,7 @@ def apply_blueprint(self: MonitoredTask, instance_pk: str): self.set_uid(slugify(instance.name)) blueprint_content = instance.retrieve() file_hash = sha512(blueprint_content.encode()).hexdigest() - importer = StringImporter(blueprint_content, instance.context) + importer = Importer.from_string(blueprint_content, instance.context) if importer.blueprint.metadata: instance.metadata = asdict(importer.blueprint.metadata) valid, logs = importer.validate() diff --git a/authentik/core/api/devices.py b/authentik/core/api/devices.py index d792791e9..777361533 100644 --- a/authentik/core/api/devices.py +++ b/authentik/core/api/devices.py @@ -1,6 +1,4 @@ """Authenticator Devices API Views""" -from django_otp import device_classes, devices_for_user -from django_otp.models import Device from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import OpenApiParameter, extend_schema from rest_framework.fields import BooleanField, CharField, IntegerField, SerializerMethodField @@ -10,6 +8,8 @@ from rest_framework.response import Response from rest_framework.viewsets import ViewSet from authentik.core.api.utils import MetaNameSerializer +from authentik.stages.authenticator import device_classes, devices_for_user +from authentik.stages.authenticator.models import Device class DeviceSerializer(MetaNameSerializer): diff --git a/authentik/core/api/transactional_applications.py b/authentik/core/api/transactional_applications.py index fa48d0523..9cc0ab0e5 100644 --- a/authentik/core/api/transactional_applications.py +++ b/authentik/core/api/transactional_applications.py @@ -13,6 +13,7 @@ from authentik.blueprints.v1.common import ( Blueprint, BlueprintEntry, BlueprintEntryDesiredState, + EntryInvalidError, KeyOf, ) from authentik.blueprints.v1.importer import Importer @@ -66,11 +67,51 @@ class TransactionApplicationSerializer(PassiveSerializer): raise ValidationError("Invalid provider model") return fq_model_name + def validate(self, attrs: dict) -> dict: + blueprint = Blueprint() + blueprint.entries.append( + BlueprintEntry( + model=attrs["provider_model"], + state=BlueprintEntryDesiredState.MUST_CREATED, + identifiers={ + "name": attrs["provider"]["name"], + }, + # Must match the name of the field on `self` + id="provider", + attrs=attrs["provider"], + ) + ) + app_data = attrs["app"] + app_data["provider"] = KeyOf(None, ScalarNode(tag="", value="provider")) + blueprint.entries.append( + BlueprintEntry( + model="authentik_core.application", + state=BlueprintEntryDesiredState.MUST_CREATED, + identifiers={ + "slug": attrs["app"]["slug"], + }, + attrs=app_data, + # Must match the name of the field on `self` + id="app", + ) + ) + importer = Importer(blueprint, {}) + try: + valid, _ = importer.validate(raise_validation_errors=True) + if not valid: + raise ValidationError("Invalid blueprint") + except EntryInvalidError as exc: + raise ValidationError( + { + exc.entry_id: exc.validation_error.detail, + } + ) + return blueprint + class TransactionApplicationResponseSerializer(PassiveSerializer): """Transactional creation response""" - valid = BooleanField() applied = BooleanField() logs = ListField(child=CharField()) @@ -90,38 +131,9 @@ class TransactionalApplicationView(APIView): """Convert data into a blueprint, validate it and apply it""" data = TransactionApplicationSerializer(data=request.data) data.is_valid(raise_exception=True) - print(data.validated_data) - blueprint = Blueprint() - blueprint.entries.append( - BlueprintEntry( - model=data.validated_data["provider_model"], - state=BlueprintEntryDesiredState.MUST_CREATED, - identifiers={ - "name": data.validated_data["provider"]["name"], - }, - id="provider", - attrs=data.validated_data["provider"], - ) - ) - app_data = data.validated_data["app"] - app_data["provider"] = KeyOf(None, ScalarNode(tag="", value="provider")) - blueprint.entries.append( - BlueprintEntry( - model="authentik_core.application", - state=BlueprintEntryDesiredState.MUST_CREATED, - identifiers={ - "slug": data.validated_data["app"]["slug"], - }, - attrs=app_data, - ) - ) - importer = Importer(blueprint, {}) - response = {"valid": False, "applied": False, "logs": []} - valid, logs = importer.validate() - response["logs"] = [x["event"] for x in logs] - response["valid"] = valid - if valid: - applied = importer.apply() - response["applied"] = applied + importer = Importer(data.validated_data, {}) + applied = importer.apply() + response = {"applied": False, "logs": []} + response["applied"] = applied return Response(response, status=200) diff --git a/authentik/core/management/commands/dev_server.py b/authentik/core/management/commands/dev_server.py new file mode 100644 index 000000000..ea53167cd --- /dev/null +++ b/authentik/core/management/commands/dev_server.py @@ -0,0 +1,9 @@ +"""custom runserver command""" +from daphne.management.commands.runserver import Command as RunServer + + +class Command(RunServer): + """custom runserver command, which doesn't show the misleading django startup message""" + + def on_bind(self, server_port): + pass diff --git a/authentik/core/management/commands/worker.py b/authentik/core/management/commands/worker.py index cb03c5846..e400e83ab 100644 --- a/authentik/core/management/commands/worker.py +++ b/authentik/core/management/commands/worker.py @@ -16,6 +16,9 @@ LOGGER = get_logger() class Command(BaseCommand): """Run worker""" + def add_arguments(self, parser): + parser.add_argument("-b", "--beat", action="store_true") + def handle(self, **options): close_old_connections() if CONFIG.get_bool("remote_debug"): @@ -26,10 +29,9 @@ class Command(BaseCommand): no_color=False, quiet=True, optimization="fair", - max_tasks_per_child=1, autoscale=(3, 1), task_events=True, - beat=True, + beat=options.get("beat", True), schedule_filename=f"{tempdir}/celerybeat-schedule", queues=["authentik", "authentik_scheduled", "authentik_events"], ) diff --git a/authentik/core/sources/flow_manager.py b/authentik/core/sources/flow_manager.py index 0339fee2f..a452f04d9 100644 --- a/authentik/core/sources/flow_manager.py +++ b/authentik/core/sources/flow_manager.py @@ -48,7 +48,7 @@ class Action(Enum): class MessageStage(StageView): """Show a pre-configured message after the flow is done""" - def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + def dispatch(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: """Show a pre-configured message after the flow is done""" message = getattr(self.executor.current_stage, "message", "") level = getattr(self.executor.current_stage, "level", messages.SUCCESS) @@ -59,10 +59,6 @@ class MessageStage(StageView): ) return self.executor.stage_ok() - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) - class SourceFlowManager: """Help sources decide what they should do after authorization. Based on source settings and diff --git a/authentik/core/sources/stage.py b/authentik/core/sources/stage.py index 749ed4bf6..385db3892 100644 --- a/authentik/core/sources/stage.py +++ b/authentik/core/sources/stage.py @@ -13,7 +13,7 @@ class PostUserEnrollmentStage(StageView): """Dynamically injected stage which saves the Connection after the user has been enrolled.""" - def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Stage used after the user has been enrolled""" connection: UserSourceConnection = self.executor.plan.context[ PLAN_CONTEXT_SOURCES_CONNECTION @@ -27,7 +27,3 @@ class PostUserEnrollmentStage(StageView): source=connection.source, ).from_http(self.request) return self.executor.stage_ok() - - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) diff --git a/authentik/core/tests/test_transactional_applications_api.py b/authentik/core/tests/test_transactional_applications_api.py index beea6b5ee..cd042bdb6 100644 --- a/authentik/core/tests/test_transactional_applications_api.py +++ b/authentik/core/tests/test_transactional_applications_api.py @@ -1,6 +1,4 @@ """Test Transactional API""" -from json import loads - from django.urls import reverse from rest_framework.test import APITestCase @@ -35,11 +33,32 @@ class TestTransactionalApplicationsAPI(APITestCase): }, }, ) - response_body = loads(response.content.decode()) - self.assertTrue(response_body["valid"]) - self.assertTrue(response_body["applied"]) + self.assertJSONEqual(response.content.decode(), {"applied": True, "logs": []}) provider = OAuth2Provider.objects.filter(name=uid).first() self.assertIsNotNone(provider) app = Application.objects.filter(slug=uid).first() self.assertIsNotNone(app) self.assertEqual(app.provider.pk, provider.pk) + + def test_create_transactional_invalid(self): + """Test transactional Application + provider creation""" + self.client.force_login(self.user) + uid = generate_id() + response = self.client.put( + reverse("authentik_api:core-transactional-application"), + data={ + "app": { + "name": uid, + "slug": uid, + }, + "provider_model": "authentik_providers_oauth2.oauth2provider", + "provider": { + "name": uid, + "authorization_flow": "", + }, + }, + ) + self.assertJSONEqual( + response.content.decode(), + {"provider": {"authorization_flow": ["This field may not be null."]}}, + ) diff --git a/authentik/core/tests/utils.py b/authentik/core/tests/utils.py index 2406edc2a..59294e6fd 100644 --- a/authentik/core/tests/utils.py +++ b/authentik/core/tests/utils.py @@ -25,10 +25,10 @@ def create_test_admin_user(name: Optional[str] = None, **kwargs) -> User: """Generate a test-admin user""" uid = generate_id(20) if not name else name group = Group.objects.create(name=uid, is_superuser=True) + kwargs.setdefault("email", f"{uid}@goauthentik.io") + kwargs.setdefault("username", uid) user: User = User.objects.create( - username=uid, name=uid, - email=f"{uid}@goauthentik.io", **kwargs, ) user.set_password(uid) diff --git a/authentik/crypto/api.py b/authentik/crypto/api.py index 367e71740..af9b1d066 100644 --- a/authentik/crypto/api.py +++ b/authentik/crypto/api.py @@ -189,6 +189,8 @@ class CertificateKeyPairFilter(FilterSet): def filter_has_key(self, queryset, name, value): # pragma: no cover """Only return certificate-key pairs with keys""" + if not value: + return queryset return queryset.exclude(key_data__exact="") class Meta: diff --git a/authentik/crypto/tests.py b/authentik/crypto/tests.py index 5f96e7ac2..3a4f05ea5 100644 --- a/authentik/crypto/tests.py +++ b/authentik/crypto/tests.py @@ -128,8 +128,26 @@ class TestCrypto(APITestCase): response = self.client.get( reverse( "authentik_api:certificatekeypair-list", - ) - + f"?name={cert.name}" + ), + data={"name": cert.name}, + ) + self.assertEqual(200, response.status_code) + body = loads(response.content.decode()) + api_cert = [x for x in body["results"] if x["name"] == cert.name][0] + self.assertEqual(api_cert["fingerprint_sha1"], cert.fingerprint_sha1) + self.assertEqual(api_cert["fingerprint_sha256"], cert.fingerprint_sha256) + + def test_list_has_key_false(self): + """Test API List with has_key set to false""" + cert = create_test_cert() + cert.key_data = "" + cert.save() + self.client.force_login(create_test_admin_user()) + response = self.client.get( + reverse( + "authentik_api:certificatekeypair-list", + ), + data={"name": cert.name, "has_key": False}, ) self.assertEqual(200, response.status_code) body = loads(response.content.decode()) @@ -144,8 +162,8 @@ class TestCrypto(APITestCase): response = self.client.get( reverse( "authentik_api:certificatekeypair-list", - ) - + f"?name={cert.name}&include_details=false" + ), + data={"name": cert.name, "include_details": False}, ) self.assertEqual(200, response.status_code) body = loads(response.content.decode()) @@ -168,8 +186,8 @@ class TestCrypto(APITestCase): reverse( "authentik_api:certificatekeypair-view-certificate", kwargs={"pk": keypair.pk}, - ) - + "?download", + ), + data={"download": True}, ) self.assertEqual(200, response.status_code) self.assertIn("Content-Disposition", response) @@ -189,8 +207,8 @@ class TestCrypto(APITestCase): reverse( "authentik_api:certificatekeypair-view-private-key", kwargs={"pk": keypair.pk}, - ) - + "?download", + ), + data={"download": True}, ) self.assertEqual(200, response.status_code) self.assertIn("Content-Disposition", response) @@ -200,7 +218,7 @@ class TestCrypto(APITestCase): self.client.force_login(create_test_admin_user()) keypair = create_test_cert() provider = OAuth2Provider.objects.create( - name="test", + name=generate_id(), client_id="test", client_secret=generate_key(), authorization_flow=create_test_flow(), diff --git a/authentik/enterprise/migrations/0002_rename_users_license_internal_users_and_more.py b/authentik/enterprise/migrations/0002_rename_users_license_internal_users_and_more.py index e8ad7dc4e..b3c199743 100644 --- a/authentik/enterprise/migrations/0002_rename_users_license_internal_users_and_more.py +++ b/authentik/enterprise/migrations/0002_rename_users_license_internal_users_and_more.py @@ -26,4 +26,11 @@ class Migration(migrations.Migration): fields=["key"], name="authentik_e_key_523e13_hash" ), ), + migrations.AlterModelOptions( + name="licenseusage", + options={ + "verbose_name": "License Usage", + "verbose_name_plural": "License Usage Records", + }, + ), ] diff --git a/authentik/enterprise/models.py b/authentik/enterprise/models.py index 37b95ba96..d10acd3ef 100644 --- a/authentik/enterprise/models.py +++ b/authentik/enterprise/models.py @@ -15,6 +15,7 @@ from django.contrib.postgres.indexes import HashIndex from django.db import models from django.db.models.query import QuerySet from django.utils.timezone import now +from django.utils.translation import gettext as _ from guardian.shortcuts import get_anonymous_user from jwt import PyJWTError, decode, get_unverified_header from rest_framework.exceptions import ValidationError @@ -187,3 +188,7 @@ class LicenseUsage(ExpiringModel): within_limits = models.BooleanField() record_date = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = _("License Usage") + verbose_name_plural = _("License Usage Records") diff --git a/authentik/enterprise/policy.py b/authentik/enterprise/policy.py index 710222816..0c714322a 100644 --- a/authentik/enterprise/policy.py +++ b/authentik/enterprise/policy.py @@ -1,44 +1,30 @@ """Enterprise license policies""" from typing import Optional -from rest_framework.serializers import BaseSerializer - from authentik.core.models import User, UserTypes from authentik.enterprise.models import LicenseKey -from authentik.policies.models import Policy from authentik.policies.types import PolicyRequest, PolicyResult from authentik.policies.views import PolicyAccessView -class EnterprisePolicy(Policy): - """Check that a user is correctly licensed for the request""" - - @property - def component(self) -> str: - return "" - - @property - def serializer(self) -> type[BaseSerializer]: - raise NotImplementedError - - def passes(self, request: PolicyRequest) -> PolicyResult: - if not LicenseKey.get_total().is_valid(): - return PolicyResult(False) - if request.user.type != UserTypes.INTERNAL: - return PolicyResult(False) - return PolicyResult(True) - - class EnterprisePolicyAccessView(PolicyAccessView): """PolicyAccessView which also checks enterprise licensing""" + def check_license(self): + """Check license""" + if not LicenseKey.get_total().is_valid(): + return False + if self.request.user.type != UserTypes.INTERNAL: + return False + return True + def user_has_access(self, user: Optional[User] = None) -> PolicyResult: user = user or self.request.user request = PolicyRequest(user) request.http_request = self.request result = super().user_has_access(user) - enterprise_result = EnterprisePolicy().passes(request) - if not enterprise_result.passing: + enterprise_result = self.check_license() + if not enterprise_result: return enterprise_result return result diff --git a/authentik/events/middleware.py b/authentik/events/middleware.py index 0215f8611..a722d8e4a 100644 --- a/authentik/events/middleware.py +++ b/authentik/events/middleware.py @@ -9,7 +9,6 @@ from django.core.exceptions import SuspiciousOperation from django.db.models import Model from django.db.models.signals import m2m_changed, post_save, pre_delete from django.http import HttpRequest, HttpResponse -from django_otp.plugins.otp_static.models import StaticToken from guardian.models import UserObjectPermission from authentik.core.models import ( @@ -30,6 +29,7 @@ from authentik.outposts.models import OutpostServiceConnection from authentik.policies.models import Policy, PolicyBindingModel from authentik.providers.oauth2.models import AccessToken, AuthorizationCode, RefreshToken from authentik.providers.scim.models import SCIMGroup, SCIMUser +from authentik.stages.authenticator_static.models import StaticToken IGNORED_MODELS = ( Event, diff --git a/authentik/flows/api/flows.py b/authentik/flows/api/flows.py index a12e28929..0508b2222 100644 --- a/authentik/flows/api/flows.py +++ b/authentik/flows/api/flows.py @@ -16,7 +16,7 @@ from structlog.stdlib import get_logger from authentik.api.decorators import permission_required from authentik.blueprints.v1.exporter import FlowExporter -from authentik.blueprints.v1.importer import SERIALIZER_CONTEXT_BLUEPRINT, StringImporter +from authentik.blueprints.v1.importer import SERIALIZER_CONTEXT_BLUEPRINT, Importer from authentik.core.api.used_by import UsedByMixin from authentik.core.api.utils import CacheSerializer, LinkSerializer, PassiveSerializer from authentik.events.utils import sanitize_dict @@ -181,7 +181,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet): if not file: return Response(data=import_response.initial_data, status=400) - importer = StringImporter(file.read().decode()) + importer = Importer.from_string(file.read().decode()) valid, logs = importer.validate() import_response.initial_data["logs"] = [sanitize_dict(log) for log in logs] import_response.initial_data["success"] = valid diff --git a/authentik/flows/exceptions.py b/authentik/flows/exceptions.py index cf38d9a50..7f903633e 100644 --- a/authentik/flows/exceptions.py +++ b/authentik/flows/exceptions.py @@ -26,3 +26,8 @@ class EmptyFlowException(SentryIgnoredException): class FlowSkipStageException(SentryIgnoredException): """Exception to skip a stage""" + + +class StageInvalidException(SentryIgnoredException): + """Exception can be thrown in a `Challenge` or `ChallengeResponse` serializer's + validation to trigger a `executor.stage_invalid()` response""" diff --git a/authentik/flows/stage.py b/authentik/flows/stage.py index 135d54f4d..d9fa75893 100644 --- a/authentik/flows/stage.py +++ b/authentik/flows/stage.py @@ -23,6 +23,7 @@ from authentik.flows.challenge import ( RedirectChallenge, WithUserInfoChallenge, ) +from authentik.flows.exceptions import StageInvalidException from authentik.flows.models import InvalidResponseAction from authentik.flows.planner import PLAN_CONTEXT_APPLICATION, PLAN_CONTEXT_PENDING_USER from authentik.lib.avatars import DEFAULT_AVATAR @@ -100,8 +101,14 @@ class ChallengeStageView(StageView): def post(self, request: Request, *args, **kwargs) -> HttpResponse: """Handle challenge response""" - challenge: ChallengeResponse = self.get_response_instance(data=request.data) - if not challenge.is_valid(): + valid = False + try: + challenge: ChallengeResponse = self.get_response_instance(data=request.data) + valid = challenge.is_valid() + except StageInvalidException as exc: + self.logger.debug("Got StageInvalidException", exc=exc) + return self.executor.stage_invalid() + if not valid: if self.executor.current_binding.invalid_response_action in [ InvalidResponseAction.RESTART, InvalidResponseAction.RESTART_WITH_CONTEXT, diff --git a/authentik/flows/tests/test_stage_views.py b/authentik/flows/tests/test_stage_views.py index e5599d540..b116ddac4 100644 --- a/authentik/flows/tests/test_stage_views.py +++ b/authentik/flows/tests/test_stage_views.py @@ -21,8 +21,9 @@ def view_tester_factory(view_class: type[StageView]) -> Callable: def tester(self: TestViews): model_class = view_class(self.exec) - self.assertIsNotNone(model_class.post) - self.assertIsNotNone(model_class.get) + if not hasattr(model_class, "dispatch"): + self.assertIsNotNone(model_class.post) + self.assertIsNotNone(model_class.get) return tester diff --git a/authentik/flows/views/executor.py b/authentik/flows/views/executor.py index 758597e27..31f08c107 100644 --- a/authentik/flows/views/executor.py +++ b/authentik/flows/views/executor.py @@ -73,22 +73,21 @@ QS_QUERY = "query" def challenge_types(): - """This function returns a class which is an iterator, which returns the + """This function returns a mapping which contains all subclasses of challenges subclasses of Challenge, and Challenge itself.""" mapping = {} - classes = all_subclasses(Challenge) - classes.remove(WithUserInfoChallenge) - for cls in classes: + for cls in all_subclasses(Challenge): + if cls == WithUserInfoChallenge: + continue mapping[cls().fields["component"].default] = cls return mapping def challenge_response_types(): - """This function returns a class which is an iterator, which returns the + """This function returns a mapping which contains all subclasses of challenges subclasses of Challenge, and Challenge itself.""" mapping = {} - classes = all_subclasses(ChallengeResponse) - for cls in classes: + for cls in all_subclasses(ChallengeResponse): mapping[cls(stage=None).fields["component"].default] = cls return mapping @@ -279,7 +278,7 @@ class FlowExecutorView(APIView): span.set_data("Method", "GET") span.set_data("authentik Stage", self.current_stage_view) span.set_data("authentik Flow", self.flow.slug) - stage_response = self.current_stage_view.get(request, *args, **kwargs) + stage_response = self.current_stage_view.dispatch(request) return to_stage_response(request, stage_response) except Exception as exc: # pylint: disable=broad-except return self.handle_exception(exc) @@ -323,7 +322,7 @@ class FlowExecutorView(APIView): span.set_data("Method", "POST") span.set_data("authentik Stage", self.current_stage_view) span.set_data("authentik Flow", self.flow.slug) - stage_response = self.current_stage_view.post(request, *args, **kwargs) + stage_response = self.current_stage_view.dispatch(request) return to_stage_response(request, stage_response) except Exception as exc: # pylint: disable=broad-except return self.handle_exception(exc) @@ -346,10 +345,15 @@ class FlowExecutorView(APIView): def restart_flow(self, keep_context=False) -> HttpResponse: """Restart the currently active flow, optionally keeping the current context""" planner = FlowPlanner(self.flow) + planner.use_cache = False default_context = None if keep_context: default_context = self.plan.context - plan = planner.plan(self.request, default_context) + try: + plan = planner.plan(self.request, default_context) + except FlowNonApplicableException as exc: + self._logger.warning("f(exec): Flow restart not applicable to current user", exc=exc) + return self.handle_invalid_flow(exc) self.request.session[SESSION_KEY_PLAN] = plan kwargs = self.kwargs kwargs.update({"flow_slug": self.flow.slug}) diff --git a/authentik/lib/default.yml b/authentik/lib/default.yml index b9aad30bd..fb5a652ae 100644 --- a/authentik/lib/default.yml +++ b/authentik/lib/default.yml @@ -1,4 +1,4 @@ -# update website/docs/installation/configuration.md +# update website/docs/installation/configuration.mdx # This is the default configuration file postgresql: host: localhost @@ -84,6 +84,9 @@ ldap: tls: ciphers: null +reputation: + expiry: 86400 + cookie_domain: null disable_update_check: false disable_startup_analytics: false diff --git a/authentik/lib/expression/evaluator.py b/authentik/lib/expression/evaluator.py index 9580280e3..7163dbf74 100644 --- a/authentik/lib/expression/evaluator.py +++ b/authentik/lib/expression/evaluator.py @@ -7,7 +7,6 @@ from typing import Any, Iterable, Optional from cachetools import TLRUCache, cached from django.core.exceptions import FieldError -from django_otp import devices_for_user from guardian.shortcuts import get_anonymous_user from rest_framework.serializers import ValidationError from sentry_sdk.hub import Hub @@ -20,6 +19,7 @@ from authentik.lib.utils.http import get_http_session from authentik.policies.models import Policy, PolicyBinding from authentik.policies.process import PolicyProcess from authentik.policies.types import PolicyRequest, PolicyResult +from authentik.stages.authenticator import devices_for_user LOGGER = get_logger() diff --git a/authentik/lib/logging.py b/authentik/lib/logging.py index 379507e74..682475230 100644 --- a/authentik/lib/logging.py +++ b/authentik/lib/logging.py @@ -1,7 +1,112 @@ """logging helpers""" +import logging from logging import Logger from os import getpid +import structlog + +from authentik.lib.config import CONFIG + +LOG_PRE_CHAIN = [ + # Add the log level and a timestamp to the event_dict if the log entry + # is not from structlog. + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog.processors.TimeStamper(), + structlog.processors.StackInfoRenderer(), +] + + +def get_log_level(): + """Get log level, clamp trace to debug""" + level = CONFIG.get("log_level").upper() + # We could add a custom level to stdlib logging and structlog, but it's not easy or clean + # https://stackoverflow.com/questions/54505487/custom-log-level-not-working-with-structlog + # Additionally, the entire code uses debug as highest level + # so that would have to be re-written too + if level == "TRACE": + level = "DEBUG" + return level + + +def structlog_configure(): + """Configure structlog itself""" + structlog.configure_once( + processors=[ + structlog.stdlib.add_log_level, + structlog.stdlib.add_logger_name, + structlog.contextvars.merge_contextvars, + add_process_id, + structlog.stdlib.PositionalArgumentsFormatter(), + structlog.processors.TimeStamper(fmt="iso", utc=False), + structlog.processors.StackInfoRenderer(), + structlog.processors.dict_tracebacks, + structlog.stdlib.ProcessorFormatter.wrap_for_formatter, + ], + logger_factory=structlog.stdlib.LoggerFactory(), + wrapper_class=structlog.make_filtering_bound_logger( + getattr(logging, get_log_level(), logging.WARNING) + ), + cache_logger_on_first_use=True, + ) + + +def get_logger_config(): + """Configure python stdlib's logging""" + debug = CONFIG.get_bool("debug") + global_level = get_log_level() + base_config = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "json": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.processors.JSONRenderer(sort_keys=True), + "foreign_pre_chain": LOG_PRE_CHAIN + [structlog.processors.dict_tracebacks], + }, + "console": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.dev.ConsoleRenderer(colors=debug), + "foreign_pre_chain": LOG_PRE_CHAIN, + }, + }, + "handlers": { + "console": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "console" if debug else "json", + }, + }, + "loggers": {}, + } + + handler_level_map = { + "": global_level, + "authentik": global_level, + "django": "WARNING", + "django.request": "ERROR", + "celery": "WARNING", + "selenium": "WARNING", + "docker": "WARNING", + "urllib3": "WARNING", + "websockets": "WARNING", + "daphne": "WARNING", + "kubernetes": "INFO", + "asyncio": "WARNING", + "redis": "WARNING", + "silk": "INFO", + "fsevents": "WARNING", + "uvicorn": "WARNING", + "gunicorn": "INFO", + } + for handler_name, level in handler_level_map.items(): + base_config["loggers"][handler_name] = { + "handlers": ["console"], + "level": level, + "propagate": False, + } + return base_config + def add_process_id(logger: Logger, method_name: str, event_dict): """Add the current process ID""" diff --git a/authentik/policies/api/bindings.py b/authentik/policies/api/bindings.py index 38041b14c..59b28d262 100644 --- a/authentik/policies/api/bindings.py +++ b/authentik/policies/api/bindings.py @@ -77,6 +77,7 @@ class PolicyBindingSerializer(ModelSerializer): "enabled", "order", "timeout", + "failure_result", ] def validate(self, attrs: OrderedDict) -> OrderedDict: diff --git a/authentik/policies/migrations/0011_policybinding_failure_result_and_more.py b/authentik/policies/migrations/0011_policybinding_failure_result_and_more.py new file mode 100644 index 000000000..538cdc2e6 --- /dev/null +++ b/authentik/policies/migrations/0011_policybinding_failure_result_and_more.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.5 on 2023-09-13 18:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_policies", "0010_alter_policy_name"), + ] + + operations = [ + migrations.AddField( + model_name="policybinding", + name="failure_result", + field=models.BooleanField( + default=False, help_text="Result if the Policy execution fails." + ), + ), + migrations.AlterField( + model_name="policybinding", + name="timeout", + field=models.PositiveIntegerField( + default=30, help_text="Timeout after which Policy execution is terminated." + ), + ), + ] diff --git a/authentik/policies/models.py b/authentik/policies/models.py index 0eb353206..2e7d69c61 100644 --- a/authentik/policies/models.py +++ b/authentik/policies/models.py @@ -85,9 +85,12 @@ class PolicyBinding(SerializerModel): default=False, help_text=_("Negates the outcome of the policy. Messages are unaffected."), ) - timeout = models.IntegerField( + timeout = models.PositiveIntegerField( default=30, help_text=_("Timeout after which Policy execution is terminated.") ) + failure_result = models.BooleanField( + default=False, help_text=_("Result if the Policy execution fails.") + ) order = models.IntegerField() diff --git a/authentik/policies/process.py b/authentik/policies/process.py index 3c6710a51..89dc548da 100644 --- a/authentik/policies/process.py +++ b/authentik/policies/process.py @@ -98,8 +98,8 @@ class PolicyProcess(PROCESS_CLASS): # Create policy exception event, only when we're not debugging if not self.request.debug: self.create_event(EventAction.POLICY_EXCEPTION, message=error_string) - LOGGER.debug("P_ENG(proc): error", exc=src_exc) - policy_result = PolicyResult(False, str(src_exc)) + LOGGER.debug("P_ENG(proc): error, using failure result", exc=src_exc) + policy_result = PolicyResult(self.binding.failure_result, str(src_exc)) policy_result.source_binding = self.binding should_cache = self.request.should_cache if should_cache: diff --git a/authentik/policies/reputation/api.py b/authentik/policies/reputation/api.py index fc9eafcab..9e9d95e13 100644 --- a/authentik/policies/reputation/api.py +++ b/authentik/policies/reputation/api.py @@ -1,5 +1,7 @@ """Reputation policy API Views""" +from django.utils.translation import gettext_lazy as _ from rest_framework import mixins +from rest_framework.exceptions import ValidationError from rest_framework.serializers import ModelSerializer from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -11,6 +13,11 @@ from authentik.policies.reputation.models import Reputation, ReputationPolicy class ReputationPolicySerializer(PolicySerializer): """Reputation Policy Serializer""" + def validate(self, attrs: dict) -> dict: + if not attrs.get("check_ip", False) and not attrs.get("check_username", False): + raise ValidationError(_("Either IP or Username must be checked")) + return super().validate(attrs) + class Meta: model = ReputationPolicy fields = PolicySerializer.Meta.fields + [ diff --git a/authentik/policies/reputation/migrations/0005_reputation_expires_reputation_expiring.py b/authentik/policies/reputation/migrations/0005_reputation_expires_reputation_expiring.py new file mode 100644 index 000000000..b6197e685 --- /dev/null +++ b/authentik/policies/reputation/migrations/0005_reputation_expires_reputation_expiring.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.4 on 2023-08-31 10:42 + +from django.db import migrations, models + +import authentik.policies.reputation.models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_policies_reputation", "0004_reputationpolicy_authentik_p_policy__8f0d70_idx"), + ] + + operations = [ + migrations.AddField( + model_name="reputation", + name="expires", + field=models.DateTimeField( + default=authentik.policies.reputation.models.reputation_expiry + ), + ), + migrations.AddField( + model_name="reputation", + name="expiring", + field=models.BooleanField(default=True), + ), + migrations.AlterModelOptions( + name="reputation", + options={ + "verbose_name": "Reputation Score", + "verbose_name_plural": "Reputation Scores", + }, + ), + ] diff --git a/authentik/policies/reputation/models.py b/authentik/policies/reputation/models.py index 8bc999d01..723614f51 100644 --- a/authentik/policies/reputation/models.py +++ b/authentik/policies/reputation/models.py @@ -1,13 +1,17 @@ """authentik reputation request policy""" +from datetime import timedelta from uuid import uuid4 from django.db import models from django.db.models import Sum from django.db.models.query_utils import Q +from django.utils.timezone import now from django.utils.translation import gettext as _ from rest_framework.serializers import BaseSerializer from structlog import get_logger +from authentik.core.models import ExpiringModel +from authentik.lib.config import CONFIG from authentik.lib.models import SerializerModel from authentik.lib.utils.http import get_client_ip from authentik.policies.models import Policy @@ -17,6 +21,11 @@ LOGGER = get_logger() CACHE_KEY_PREFIX = "goauthentik.io/policies/reputation/scores/" +def reputation_expiry(): + """Reputation expiry""" + return now() + timedelta(seconds=CONFIG.get_int("reputation.expiry")) + + class ReputationPolicy(Policy): """Return true if request IP/target username's score is below a certain threshold""" @@ -59,7 +68,7 @@ class ReputationPolicy(Policy): verbose_name_plural = _("Reputation Policies") -class Reputation(SerializerModel): +class Reputation(ExpiringModel, SerializerModel): """Reputation for user and or IP.""" reputation_uuid = models.UUIDField(primary_key=True, unique=True, default=uuid4) @@ -69,6 +78,8 @@ class Reputation(SerializerModel): ip_geo_data = models.JSONField(default=dict) score = models.BigIntegerField(default=0) + expires = models.DateTimeField(default=reputation_expiry) + updated = models.DateTimeField(auto_now_add=True) @property @@ -81,4 +92,6 @@ class Reputation(SerializerModel): return f"Reputation {self.identifier}/{self.ip} @ {self.score}" class Meta: + verbose_name = _("Reputation Score") + verbose_name_plural = _("Reputation Scores") unique_together = ("identifier", "ip") diff --git a/authentik/policies/reputation/tests.py b/authentik/policies/reputation/tests.py index 65910b89b..76a8cea4a 100644 --- a/authentik/policies/reputation/tests.py +++ b/authentik/policies/reputation/tests.py @@ -3,6 +3,8 @@ from django.core.cache import cache from django.test import RequestFactory, TestCase from authentik.core.models import User +from authentik.lib.generators import generate_id +from authentik.policies.reputation.api import ReputationPolicySerializer from authentik.policies.reputation.models import CACHE_KEY_PREFIX, Reputation, ReputationPolicy from authentik.policies.reputation.tasks import save_reputation from authentik.policies.types import PolicyRequest @@ -61,3 +63,8 @@ class TestReputationPolicy(TestCase): name="reputation-test", threshold=0 ) self.assertTrue(policy.passes(request).passing) + + def test_api(self): + """Test API Validation""" + no_toggle = ReputationPolicySerializer(data={"name": generate_id(), "threshold": -5}) + self.assertFalse(no_toggle.is_valid()) diff --git a/authentik/policies/tests/test_engine.py b/authentik/policies/tests/test_engine.py index 1159e2db3..d173e40ac 100644 --- a/authentik/policies/tests/test_engine.py +++ b/authentik/policies/tests/test_engine.py @@ -97,6 +97,17 @@ class TestPolicyEngine(TestCase): self.assertEqual(result.passing, False) self.assertEqual(result.messages, ("division by zero",)) + def test_engine_policy_error_failure(self): + """Test policy raising an error flag""" + pbm = PolicyBindingModel.objects.create() + PolicyBinding.objects.create( + target=pbm, policy=self.policy_raises, order=0, failure_result=True + ) + engine = PolicyEngine(pbm, self.user) + result = engine.build().result + self.assertEqual(result.passing, True) + self.assertEqual(result.messages, ("division by zero",)) + def test_engine_policy_type(self): """Test invalid policy type""" pbm = PolicyBindingModel.objects.create() diff --git a/authentik/providers/saml/api/providers.py b/authentik/providers/saml/api/providers.py index 55328eec6..891289a08 100644 --- a/authentik/providers/saml/api/providers.py +++ b/authentik/providers/saml/api/providers.py @@ -13,10 +13,9 @@ from rest_framework.decorators import action from rest_framework.fields import CharField, FileField, SerializerMethodField from rest_framework.parsers import MultiPartParser from rest_framework.permissions import AllowAny -from rest_framework.relations import SlugRelatedField from rest_framework.request import Request from rest_framework.response import Response -from rest_framework.serializers import ValidationError +from rest_framework.serializers import PrimaryKeyRelatedField, ValidationError from rest_framework.viewsets import ModelViewSet from structlog.stdlib import get_logger @@ -168,10 +167,8 @@ class SAMLProviderImportSerializer(PassiveSerializer): """Import saml provider from XML Metadata""" name = CharField(required=True) - # Using SlugField because https://github.com/OpenAPITools/openapi-generator/issues/3278 - authorization_flow = SlugRelatedField( + authorization_flow = PrimaryKeyRelatedField( queryset=Flow.objects.filter(designation=FlowDesignation.AUTHORIZATION), - slug_field="slug", ) file = FileField() diff --git a/authentik/providers/saml/processors/metadata.py b/authentik/providers/saml/processors/metadata.py index 83c1a1ee3..5aecf24f6 100644 --- a/authentik/providers/saml/processors/metadata.py +++ b/authentik/providers/saml/processors/metadata.py @@ -171,6 +171,8 @@ class MetadataProcessor: entity_descriptor, f"{{{NS_SAML_METADATA}}}IDPSSODescriptor" ) idp_sso_descriptor.attrib["protocolSupportEnumeration"] = NS_SAML_PROTOCOL + if self.provider.verification_kp: + idp_sso_descriptor.attrib["WantAuthnRequestsSigned"] = "true" signing_descriptor = self.get_signing_key_descriptor() if signing_descriptor is not None: diff --git a/authentik/providers/saml/tests/test_api.py b/authentik/providers/saml/tests/test_api.py index f0c878e5a..de86d5cbb 100644 --- a/authentik/providers/saml/tests/test_api.py +++ b/authentik/providers/saml/tests/test_api.py @@ -89,7 +89,7 @@ class TestSAMLProviderAPI(APITestCase): { "file": metadata, "name": generate_id(), - "authorization_flow": create_test_flow(FlowDesignation.AUTHORIZATION).slug, + "authorization_flow": create_test_flow(FlowDesignation.AUTHORIZATION).pk, }, format="multipart", ) @@ -106,7 +106,7 @@ class TestSAMLProviderAPI(APITestCase): { "file": metadata, "name": generate_id(), - "authorization_flow": create_test_flow().slug, + "authorization_flow": create_test_flow().pk, }, format="multipart", ) diff --git a/authentik/providers/saml/tests/test_metadata.py b/authentik/providers/saml/tests/test_metadata.py index ffe1b2a4a..bc4156b5b 100644 --- a/authentik/providers/saml/tests/test_metadata.py +++ b/authentik/providers/saml/tests/test_metadata.py @@ -12,7 +12,7 @@ from authentik.lib.xml import lxml_from_string from authentik.providers.saml.models import SAMLBindings, SAMLPropertyMapping, SAMLProvider from authentik.providers.saml.processors.metadata import MetadataProcessor from authentik.providers.saml.processors.metadata_parser import ServiceProviderMetadataParser -from authentik.sources.saml.processors.constants import NS_MAP +from authentik.sources.saml.processors.constants import NS_MAP, NS_SAML_METADATA class TestServiceProviderMetadataParser(TestCase): @@ -55,6 +55,24 @@ class TestServiceProviderMetadataParser(TestCase): schema = etree.XMLSchema(etree.parse("schemas/saml-schema-metadata-2.0.xsd")) # nosec self.assertTrue(schema.validate(metadata)) + def test_schema_want_authn_requests_signed(self): + """Test metadata generation with WantAuthnRequestsSigned""" + cert = create_test_cert() + provider = SAMLProvider.objects.create( + name=generate_id(), + authorization_flow=self.flow, + verification_kp=cert, + ) + Application.objects.create( + name=generate_id(), + slug=generate_id(), + provider=provider, + ) + request = self.factory.get("/") + metadata = lxml_from_string(MetadataProcessor(provider, request).build_entity_descriptor()) + idp_sso_descriptor = metadata.findall(f"{{{NS_SAML_METADATA}}}IDPSSODescriptor")[0] + self.assertEqual(idp_sso_descriptor.attrib["WantAuthnRequestsSigned"], "true") + def test_simple(self): """Test simple metadata without Signing""" metadata = ServiceProviderMetadataParser().parse(load_fixture("fixtures/simple.xml")) diff --git a/authentik/providers/scim/signals.py b/authentik/providers/scim/signals.py index c9e179ac9..e799044d6 100644 --- a/authentik/providers/scim/signals.py +++ b/authentik/providers/scim/signals.py @@ -23,6 +23,8 @@ def post_save_provider(sender: type[Model], instance, created: bool, **_): @receiver(post_save, sender=Group) def post_save_scim(sender: type[Model], instance: User | Group, created: bool, **_): """Post save handler""" + if not SCIMProvider.objects.filter(backchannel_application__isnull=False).exists(): + return scim_signal_direct.delay(class_to_path(instance.__class__), instance.pk, PatchOp.add.value) @@ -30,6 +32,8 @@ def post_save_scim(sender: type[Model], instance: User | Group, created: bool, * @receiver(pre_delete, sender=Group) def pre_delete_scim(sender: type[Model], instance: User | Group, **_): """Pre-delete handler""" + if not SCIMProvider.objects.filter(backchannel_application__isnull=False).exists(): + return scim_signal_direct.delay(class_to_path(instance.__class__), instance.pk, PatchOp.remove.value) @@ -40,6 +44,8 @@ def m2m_changed_scim( """Sync group membership""" if action not in ["post_add", "post_remove"]: return + if not SCIMProvider.objects.filter(backchannel_application__isnull=False).exists(): + return # reverse: instance is a Group, pk_set is a list of user pks # non-reverse: instance is a User, pk_set is a list of groups if reverse: diff --git a/authentik/root/middleware.py b/authentik/root/middleware.py index 590884c92..8f97c3c9e 100644 --- a/authentik/root/middleware.py +++ b/authentik/root/middleware.py @@ -172,7 +172,7 @@ class ChannelsLoggingMiddleware: LOGGER.info( scope["path"], scheme="ws", - remote=scope.get("client", [""])[0], + remote=headers.get(b"x-forwarded-for", b"").decode(), user_agent=headers.get(b"user-agent", b"").decode(), **kwargs, ) diff --git a/authentik/root/settings.py b/authentik/root/settings.py index 0302b3116..0fa099755 100644 --- a/authentik/root/settings.py +++ b/authentik/root/settings.py @@ -1,25 +1,21 @@ """root settings for authentik""" import importlib -import logging import os from hashlib import sha512 from pathlib import Path from urllib.parse import quote_plus -import structlog from celery.schedules import crontab from sentry_sdk import set_tag from authentik import ENV_GIT_HASH_KEY, __version__ from authentik.lib.config import CONFIG -from authentik.lib.logging import add_process_id +from authentik.lib.logging import get_logger_config, structlog_configure from authentik.lib.sentry import sentry_init from authentik.lib.utils.reflection import get_env from authentik.stages.password import BACKEND_APP_PASSWORD, BACKEND_INBUILT, BACKEND_LDAP -LOGGER = structlog.get_logger() - BASE_DIR = Path(__file__).absolute().parent.parent.parent STATICFILES_DIRS = [BASE_DIR / Path("web")] MEDIA_ROOT = BASE_DIR / Path("media") @@ -85,6 +81,7 @@ INSTALLED_APPS = [ "authentik.sources.oauth", "authentik.sources.plex", "authentik.sources.saml", + "authentik.stages.authenticator", "authentik.stages.authenticator_duo", "authentik.stages.authenticator_sms", "authentik.stages.authenticator_static", @@ -368,90 +365,9 @@ MEDIA_URL = "/media/" TEST = False TEST_RUNNER = "authentik.root.test_runner.PytestTestRunner" -# We can't check TEST here as its set later by the test runner -LOG_LEVEL = CONFIG.get("log_level").upper() if "TF_BUILD" not in os.environ else "DEBUG" -# We could add a custom level to stdlib logging and structlog, but it's not easy or clean -# https://stackoverflow.com/questions/54505487/custom-log-level-not-working-with-structlog -# Additionally, the entire code uses debug as highest level so that would have to be re-written too -if LOG_LEVEL == "TRACE": - LOG_LEVEL = "DEBUG" -structlog.configure_once( - processors=[ - structlog.stdlib.add_log_level, - structlog.stdlib.add_logger_name, - structlog.contextvars.merge_contextvars, - add_process_id, - structlog.stdlib.PositionalArgumentsFormatter(), - structlog.processors.TimeStamper(fmt="iso", utc=False), - structlog.processors.StackInfoRenderer(), - structlog.processors.dict_tracebacks, - structlog.stdlib.ProcessorFormatter.wrap_for_formatter, - ], - logger_factory=structlog.stdlib.LoggerFactory(), - wrapper_class=structlog.make_filtering_bound_logger( - getattr(logging, LOG_LEVEL, logging.WARNING) - ), - cache_logger_on_first_use=True, -) - -LOG_PRE_CHAIN = [ - # Add the log level and a timestamp to the event_dict if the log entry - # is not from structlog. - structlog.stdlib.add_log_level, - structlog.stdlib.add_logger_name, - structlog.processors.TimeStamper(), - structlog.processors.StackInfoRenderer(), -] - -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "json": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.processors.JSONRenderer(sort_keys=True), - "foreign_pre_chain": LOG_PRE_CHAIN, - }, - "console": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.dev.ConsoleRenderer(colors=DEBUG), - "foreign_pre_chain": LOG_PRE_CHAIN, - }, - }, - "handlers": { - "console": { - "level": "DEBUG", - "class": "logging.StreamHandler", - "formatter": "console" if DEBUG else "json", - }, - }, - "loggers": {}, -} - -_LOGGING_HANDLER_MAP = { - "": LOG_LEVEL, - "authentik": LOG_LEVEL, - "django": "WARNING", - "django.request": "ERROR", - "celery": "WARNING", - "selenium": "WARNING", - "docker": "WARNING", - "urllib3": "WARNING", - "websockets": "WARNING", - "daphne": "WARNING", - "kubernetes": "INFO", - "asyncio": "WARNING", - "redis": "WARNING", - "silk": "INFO", - "fsevents": "WARNING", -} -for handler_name, level in _LOGGING_HANDLER_MAP.items(): - LOGGING["loggers"][handler_name] = { - "handlers": ["console"], - "level": level, - "propagate": False, - } +structlog_configure() +LOGGING = get_logger_config() _DISALLOWED_ITEMS = [ diff --git a/authentik/root/test_runner.py b/authentik/root/test_runner.py index febcedf9c..5141613b0 100644 --- a/authentik/root/test_runner.py +++ b/authentik/root/test_runner.py @@ -20,7 +20,7 @@ class PytestTestRunner: # pragma: no cover self.failfast = failfast self.keepdb = keepdb - self.args = ["-vv", "--full-trace"] + self.args = [] if self.failfast: self.args.append("--exitfirst") if self.keepdb: diff --git a/authentik/sources/ldap/sync/base.py b/authentik/sources/ldap/sync/base.py index b1d12df7f..2a769e101 100644 --- a/authentik/sources/ldap/sync/base.py +++ b/authentik/sources/ldap/sync/base.py @@ -153,8 +153,10 @@ class BaseLDAPSynchronizer: try: value = mapping.evaluate(user=None, request=None, ldap=kwargs, dn=object_dn) if value is None: + self._logger.warning("property mapping returned None", mapping=mapping) continue if isinstance(value, (bytes)): + self._logger.warning("property mapping returned bytes", mapping=mapping) continue object_field = mapping.object_field if object_field.startswith("attributes."): diff --git a/authentik/sources/ldap/sync/groups.py b/authentik/sources/ldap/sync/groups.py index a10e0a904..68eedcc34 100644 --- a/authentik/sources/ldap/sync/groups.py +++ b/authentik/sources/ldap/sync/groups.py @@ -18,6 +18,9 @@ class GroupLDAPSynchronizer(BaseLDAPSynchronizer): return "groups" def get_objects(self, **kwargs) -> Generator: + if not self._source.sync_groups: + self.message("Group syncing is disabled for this Source") + return iter(()) return self.search_paginator( search_base=self.base_dn_groups, search_filter=self._source.group_object_filter, diff --git a/authentik/sources/ldap/sync/membership.py b/authentik/sources/ldap/sync/membership.py index 432715c5a..134f12380 100644 --- a/authentik/sources/ldap/sync/membership.py +++ b/authentik/sources/ldap/sync/membership.py @@ -24,6 +24,9 @@ class MembershipLDAPSynchronizer(BaseLDAPSynchronizer): return "membership" def get_objects(self, **kwargs) -> Generator: + if not self._source.sync_groups: + self.message("Group syncing is disabled for this Source") + return iter(()) return self.search_paginator( search_base=self.base_dn_groups, search_filter=self._source.group_object_filter, diff --git a/authentik/sources/ldap/sync/users.py b/authentik/sources/ldap/sync/users.py index 4a67c1cdc..68d966022 100644 --- a/authentik/sources/ldap/sync/users.py +++ b/authentik/sources/ldap/sync/users.py @@ -20,6 +20,9 @@ class UserLDAPSynchronizer(BaseLDAPSynchronizer): return "users" def get_objects(self, **kwargs) -> Generator: + if not self._source.sync_users: + self.message("User syncing is disabled for this Source") + return iter(()) return self.search_paginator( search_base=self.base_dn_users, search_filter=self._source.user_object_filter, diff --git a/authentik/sources/ldap/sync/vendor/freeipa.py b/authentik/sources/ldap/sync/vendor/freeipa.py index 2eff854f6..fd42c001c 100644 --- a/authentik/sources/ldap/sync/vendor/freeipa.py +++ b/authentik/sources/ldap/sync/vendor/freeipa.py @@ -45,7 +45,13 @@ class FreeIPA(BaseLDAPSynchronizer): # 389-ds and this will trigger regardless if "nsaccountlock" not in attributes: return - is_active = attributes.get("nsaccountlock", False) + # For some reason, nsaccountlock is not defined properly in the schema as bool + # hence we get it as a list of strings + _is_locked = str(self._flatten(attributes.get("nsaccountlock", ["FALSE"]))) + # So we have to attempt to convert it to a bool + is_locked = _is_locked.lower() == "true" + # And then invert it since freeipa saves locked and we save active + is_active = not is_locked if is_active != user.is_active: user.is_active = is_active user.save() diff --git a/authentik/sources/ldap/tasks.py b/authentik/sources/ldap/tasks.py index 39aeb4c3c..0223a68ba 100644 --- a/authentik/sources/ldap/tasks.py +++ b/authentik/sources/ldap/tasks.py @@ -33,7 +33,13 @@ def ldap_sync_all(): ldap_sync_single(source.pk) -@CELERY_APP.task() +@CELERY_APP.task( + # We take the configured hours timeout time by 2.5 as we run user and + # group in parallel and then membership, so 2x is to cover the serial tasks, + # and 0.5x on top of that to give some more leeway + soft_time_limit=(60 * 60 * CONFIG.get_int("ldap.task_timeout_hours")) * 2.5, + task_time_limit=(60 * 60 * CONFIG.get_int("ldap.task_timeout_hours")) * 2.5, +) def ldap_sync_single(source_pk: str): """Sync a single source""" source: LDAPSource = LDAPSource.objects.filter(pk=source_pk).first() diff --git a/authentik/sources/ldap/tests/mock_freeipa.py b/authentik/sources/ldap/tests/mock_freeipa.py new file mode 100644 index 000000000..f2bb8bb7b --- /dev/null +++ b/authentik/sources/ldap/tests/mock_freeipa.py @@ -0,0 +1,111 @@ +"""ldap testing utils""" + +from ldap3 import MOCK_SYNC, OFFLINE_DS389_1_3_3, Connection, Server + + +def mock_freeipa_connection(password: str) -> Connection: + """Create mock FreeIPA-ish connection""" + server = Server("my_fake_server", get_info=OFFLINE_DS389_1_3_3) + _pass = "foo" # noqa # nosec + connection = Connection( + server, + user="cn=my_user,dc=goauthentik,dc=io", + password=_pass, + client_strategy=MOCK_SYNC, + ) + # Entry for password checking + connection.strategy.add_entry( + "cn=user,ou=users,dc=goauthentik,dc=io", + { + "name": "test-user", + "uid": "unique-test-group", + "objectClass": "person", + "displayName": "Erin M. Hagens", + }, + ) + connection.strategy.add_entry( + "cn=group1,ou=groups,dc=goauthentik,dc=io", + { + "cn": "group1", + "uid": "unique-test-group", + "objectClass": "groupOfNames", + "member": ["cn=user0,ou=users,dc=goauthentik,dc=io"], + }, + ) + # Group without SID + connection.strategy.add_entry( + "cn=group2,ou=groups,dc=goauthentik,dc=io", + { + "cn": "group2", + "objectClass": "groupOfNames", + }, + ) + connection.strategy.add_entry( + "cn=user0,ou=users,dc=goauthentik,dc=io", + { + "userPassword": password, + "name": "user0_sn", + "uid": "user0_sn", + "objectClass": "person", + }, + ) + # User without SID + connection.strategy.add_entry( + "cn=user1,ou=users,dc=goauthentik,dc=io", + { + "userPassword": "test1111", + "name": "user1_sn", + "objectClass": "person", + }, + ) + # Duplicate users + connection.strategy.add_entry( + "cn=user2,ou=users,dc=goauthentik,dc=io", + { + "userPassword": "test2222", + "name": "user2_sn", + "uid": "unique-test2222", + "objectClass": "person", + }, + ) + connection.strategy.add_entry( + "cn=user3,ou=users,dc=goauthentik,dc=io", + { + "userPassword": "test2222", + "name": "user2_sn", + "uid": "unique-test2222", + "objectClass": "person", + }, + ) + # Group with posixGroup and memberUid + connection.strategy.add_entry( + "cn=group-posix,ou=groups,dc=goauthentik,dc=io", + { + "cn": "group-posix", + "objectClass": "posixGroup", + "memberUid": ["user-posix"], + }, + ) + # User with posixAccount + connection.strategy.add_entry( + "cn=user-posix,ou=users,dc=goauthentik,dc=io", + { + "userPassword": password, + "uid": "user-posix", + "cn": "user-posix", + "objectClass": "posixAccount", + }, + ) + # Locked out user + connection.strategy.add_entry( + "cn=user-nsaccountlock,ou=users,dc=goauthentik,dc=io", + { + "userPassword": password, + "uid": "user-nsaccountlock", + "cn": "user-nsaccountlock", + "objectClass": "person", + "nsaccountlock": ["TRUE"], + }, + ) + connection.bind() + return connection diff --git a/authentik/sources/ldap/tests/mock_slapd.py b/authentik/sources/ldap/tests/mock_slapd.py index 075421f26..957b7fbdc 100644 --- a/authentik/sources/ldap/tests/mock_slapd.py +++ b/authentik/sources/ldap/tests/mock_slapd.py @@ -4,7 +4,7 @@ from ldap3 import MOCK_SYNC, OFFLINE_SLAPD_2_4, Connection, Server def mock_slapd_connection(password: str) -> Connection: - """Create mock AD connection""" + """Create mock SLAPD connection""" server = Server("my_fake_server", get_info=OFFLINE_SLAPD_2_4) _pass = "foo" # noqa # nosec connection = Connection( diff --git a/authentik/sources/ldap/tests/test_sync.py b/authentik/sources/ldap/tests/test_sync.py index 21aad1be4..6bf459017 100644 --- a/authentik/sources/ldap/tests/test_sync.py +++ b/authentik/sources/ldap/tests/test_sync.py @@ -9,7 +9,7 @@ from authentik.core.models import Group, User from authentik.core.tests.utils import create_test_admin_user from authentik.events.models import Event, EventAction from authentik.events.monitored_tasks import TaskInfo, TaskResultStatus -from authentik.lib.generators import generate_key +from authentik.lib.generators import generate_id, generate_key from authentik.lib.utils.reflection import class_to_path from authentik.sources.ldap.models import LDAPPropertyMapping, LDAPSource from authentik.sources.ldap.sync.groups import GroupLDAPSynchronizer @@ -17,6 +17,7 @@ from authentik.sources.ldap.sync.membership import MembershipLDAPSynchronizer from authentik.sources.ldap.sync.users import UserLDAPSynchronizer from authentik.sources.ldap.tasks import ldap_sync, ldap_sync_all from authentik.sources.ldap.tests.mock_ad import mock_ad_connection +from authentik.sources.ldap.tests.mock_freeipa import mock_freeipa_connection from authentik.sources.ldap.tests.mock_slapd import mock_slapd_connection LDAP_PASSWORD = generate_key() @@ -70,6 +71,28 @@ class LDAPSyncTests(TestCase): ) self.assertTrue(events.exists()) + def test_sync_mapping(self): + """Test property mappings""" + none = LDAPPropertyMapping.objects.create( + name=generate_id(), object_field="none", expression="return None" + ) + byte_mapping = LDAPPropertyMapping.objects.create( + name=generate_id(), object_field="bytes", expression="return b''" + ) + self.source.property_mappings.set( + LDAPPropertyMapping.objects.filter( + Q(managed__startswith="goauthentik.io/sources/ldap/default") + | Q(managed__startswith="goauthentik.io/sources/ldap/ms") + ) + ) + self.source.property_mappings.add(none, byte_mapping) + connection = MagicMock(return_value=mock_ad_connection(LDAP_PASSWORD)) + + # we basically just test that the mappings don't throw errors + with patch("authentik.sources.ldap.models.LDAPSource.connection", connection): + user_sync = UserLDAPSynchronizer(self.source) + user_sync.sync_full() + def test_sync_users_ad(self): """Test user sync""" self.source.property_mappings.set( @@ -78,7 +101,6 @@ class LDAPSyncTests(TestCase): | Q(managed__startswith="goauthentik.io/sources/ldap/ms") ) ) - self.source.save() connection = MagicMock(return_value=mock_ad_connection(LDAP_PASSWORD)) # Create the user beforehand so we can set attributes and check they aren't removed @@ -112,7 +134,6 @@ class LDAPSyncTests(TestCase): | Q(managed__startswith="goauthentik.io/sources/ldap/openldap") ) ) - self.source.save() connection = MagicMock(return_value=mock_slapd_connection(LDAP_PASSWORD)) with patch("authentik.sources.ldap.models.LDAPSource.connection", connection): user_sync = UserLDAPSynchronizer(self.source) @@ -120,6 +141,23 @@ class LDAPSyncTests(TestCase): self.assertTrue(User.objects.filter(username="user0_sn").exists()) self.assertFalse(User.objects.filter(username="user1_sn").exists()) + def test_sync_users_freeipa_ish(self): + """Test user sync (FreeIPA-ish), mainly testing vendor quirks""" + self.source.object_uniqueness_field = "uid" + self.source.property_mappings.set( + LDAPPropertyMapping.objects.filter( + Q(managed__startswith="goauthentik.io/sources/ldap/default") + | Q(managed__startswith="goauthentik.io/sources/ldap/openldap") + ) + ) + connection = MagicMock(return_value=mock_freeipa_connection(LDAP_PASSWORD)) + with patch("authentik.sources.ldap.models.LDAPSource.connection", connection): + user_sync = UserLDAPSynchronizer(self.source) + user_sync.sync_full() + self.assertTrue(User.objects.filter(username="user0_sn").exists()) + self.assertFalse(User.objects.filter(username="user1_sn").exists()) + self.assertFalse(User.objects.get(username="user-nsaccountlock").is_active) + def test_sync_groups_ad(self): """Test group sync""" self.source.property_mappings.set( diff --git a/authentik/sources/plex/tasks.py b/authentik/sources/plex/tasks.py index 39e69547e..c83b43f21 100644 --- a/authentik/sources/plex/tasks.py +++ b/authentik/sources/plex/tasks.py @@ -30,7 +30,7 @@ def check_plex_token(self: MonitoredTask, source_slug: int): self.set_status(TaskResult(TaskResultStatus.SUCCESSFUL, ["Plex token is valid."])) except RequestException as exc: error = exception_to_string(exc) - if len(source.plex_token) < 1: + if len(source.plex_token) > 0: error = error.replace(source.plex_token, "$PLEX_TOKEN") self.set_status( TaskResult( diff --git a/authentik/stages/authenticator/__init__.py b/authentik/stages/authenticator/__init__.py new file mode 100644 index 000000000..a6d3087e8 --- /dev/null +++ b/authentik/stages/authenticator/__init__.py @@ -0,0 +1,129 @@ +"""Authenticator devices helpers""" +from django.db import transaction + + +def verify_token(user, device_id, token): + """ + Attempts to verify a :term:`token` against a specific device, identified by + :attr:`~authentik.stages.authenticator.models.Device.persistent_id`. + + This wraps the verification process in a transaction to ensure that things + like throttling polices are properly enforced. + + :param user: The user supplying the token. + :type user: :class:`~django.contrib.auth.models.User` + + :param str device_id: A device's persistent_id value. + + :param str token: An OTP token to verify. + + :returns: The device that accepted ``token``, if any. + :rtype: :class:`~authentik.stages.authenticator.models.Device` or ``None`` + + """ + from authentik.stages.authenticator.models import Device + + verified = None + with transaction.atomic(): + device = Device.from_persistent_id(device_id, for_verify=True) + if (device is not None) and (device.user_id == user.pk) and device.verify_token(token): + verified = device + + return verified + + +def match_token(user, token): + """ + Attempts to verify a :term:`token` on every device attached to the given + user until one of them succeeds. + + .. warning:: + + This originally existed for more convenient integration with the admin + site. Its use is no longer recommended and it is not guaranteed to + interact well with more recent features (such as throttling). Tokens + should always be verified against specific devices. + + :param user: The user supplying the token. + :type user: :class:`~django.contrib.auth.models.User` + + :param str token: An OTP token to verify. + + :returns: The device that accepted ``token``, if any. + :rtype: :class:`~authentik.stages.authenticator.models.Device` or ``None`` + """ + with transaction.atomic(): + for device in devices_for_user(user, for_verify=True): + if device.verify_token(token): + break + else: + device = None + + return device + + +def devices_for_user(user, confirmed=True, for_verify=False): + """ + Return an iterable of all devices registered to the given user. + + Returns an empty iterable for anonymous users. + + :param user: standard or custom user object. + :type user: :class:`~django.contrib.auth.models.User` + + :param bool confirmed: If ``None``, all matching devices are returned. + Otherwise, this can be any true or false value to limit the query + to confirmed or unconfirmed devices, respectively. + + :param bool for_verify: If ``True``, we'll load the devices with + :meth:`~django.db.models.query.QuerySet.select_for_update` to prevent + concurrent verifications from succeeding. In which case, this must be + called inside a transaction. + + :rtype: iterable + """ + if user.is_anonymous: + return + + for model in device_classes(): + device_set = model.objects.devices_for_user(user, confirmed=confirmed) + if for_verify: + device_set = device_set.select_for_update() + + yield from device_set + + +def user_has_device(user, confirmed=True): + """ + Return ``True`` if the user has at least one device. + + Returns ``False`` for anonymous users. + + :param user: standard or custom user object. + :type user: :class:`~django.contrib.auth.models.User` + + :param confirmed: If ``None``, all matching devices are considered. + Otherwise, this can be any true or false value to limit the query + to confirmed or unconfirmed devices, respectively. + """ + try: + next(devices_for_user(user, confirmed=confirmed)) + except StopIteration: + has_device = False + else: + has_device = True + + return has_device + + +def device_classes(): + """ + Returns an iterable of all loaded device models. + """ + from django.apps import apps # isort: skip + from authentik.stages.authenticator.models import Device + + for config in apps.get_app_configs(): + for model in config.get_models(): + if issubclass(model, Device): + yield model diff --git a/authentik/stages/authenticator/apps.py b/authentik/stages/authenticator/apps.py new file mode 100644 index 000000000..5fb866e2d --- /dev/null +++ b/authentik/stages/authenticator/apps.py @@ -0,0 +1,10 @@ +"""Authenticator""" +from django.apps import AppConfig + + +class AuthentikStageAuthenticatorConfig(AppConfig): + """Authenticator App config""" + + name = "authentik.stages.authenticator" + label = "authentik_stages_authenticator" + verbose_name = "authentik Stages.Authenticator" diff --git a/authentik/stages/authenticator/models.py b/authentik/stages/authenticator/models.py new file mode 100644 index 000000000..0404a0668 --- /dev/null +++ b/authentik/stages/authenticator/models.py @@ -0,0 +1,401 @@ +"""Base authenticator models""" +from datetime import timedelta + +from django.apps import apps +from django.core.exceptions import ObjectDoesNotExist +from django.db import models +from django.utils import timezone +from django.utils.functional import cached_property + +from authentik.core.models import User +from authentik.stages.authenticator.util import random_number_token + + +class DeviceManager(models.Manager): + """ + The :class:`~django.db.models.Manager` object installed as + ``Device.objects``. + """ + + def devices_for_user(self, user, confirmed=None): + """ + Returns a queryset for all devices of this class that belong to the + given user. + + :param user: The user. + :type user: :class:`~django.contrib.auth.models.User` + + :param confirmed: If ``None``, all matching devices are returned. + Otherwise, this can be any true or false value to limit the query + to confirmed or unconfirmed devices, respectively. + """ + devices = self.model.objects.filter(user=user) + if confirmed is not None: + devices = devices.filter(confirmed=bool(confirmed)) + + return devices + + +class Device(models.Model): + """ + Abstract base model for a :term:`device` attached to a user. Plugins must + subclass this to define their OTP models. + + .. _unsaved_device_warning: + + .. warning:: + + OTP devices are inherently stateful. For example, verifying a token is + logically a mutating operation on the device, which may involve + incrementing a counter or otherwise consuming a token. A device must be + committed to the database before it can be used in any way. + + .. attribute:: user + + *ForeignKey*: Foreign key to your user model, as configured by + :setting:`AUTH_USER_MODEL` (:class:`~django.contrib.auth.models.User` + by default). + + .. attribute:: name + + *CharField*: A human-readable name to help the user identify their + devices. + + .. attribute:: confirmed + + *BooleanField*: A boolean value that tells us whether this device has + been confirmed as valid. It defaults to ``True``, but subclasses or + individual deployments can force it to ``False`` if they wish to create + a device and then ask the user for confirmation. As a rule, built-in + APIs that enumerate devices will only include those that are confirmed. + + .. attribute:: objects + + A :class:`~authentik.stages.authenticator.models.DeviceManager`. + """ + + user = models.ForeignKey( + User, + help_text="The user that this device belongs to.", + on_delete=models.CASCADE, + ) + + name = models.CharField(max_length=64, help_text="The human-readable name of this device.") + + confirmed = models.BooleanField(default=True, help_text="Is this device ready for use?") + + objects = DeviceManager() + + class Meta: + abstract = True + + def __str__(self): + try: + user = self.user + except ObjectDoesNotExist: + user = None + + return "{0} ({1})".format(self.name, user) + + @property + def persistent_id(self): + """ + A stable device identifier for forms and APIs. + """ + return "{0}/{1}".format(self.model_label(), self.id) + + @classmethod + def model_label(cls): + """ + Returns an identifier for this Django model class. + + This is just the standard "." form. + + """ + return "{0}.{1}".format(cls._meta.app_label, cls._meta.model_name) + + @classmethod + def from_persistent_id(cls, persistent_id, for_verify=False): + """ + Loads a device from its persistent id:: + + device == Device.from_persistent_id(device.persistent_id) + + :param bool for_verify: If ``True``, we'll load the device with + :meth:`~django.db.models.query.QuerySet.select_for_update` to + prevent concurrent verifications from succeeding. In which case, + this must be called inside a transaction. + + """ + device = None + + try: + model_label, device_id = persistent_id.rsplit("/", 1) + app_label, model_name = model_label.split(".") + + device_cls = apps.get_model(app_label, model_name) + if issubclass(device_cls, Device): + device_set = device_cls.objects.filter(id=int(device_id)) + if for_verify: + device_set = device_set.select_for_update() + device = device_set.first() + except (ValueError, LookupError): + pass + + return device + + def is_interactive(self): + """ + Returns ``True`` if this is an interactive device. The default + implementation returns ``True`` if + :meth:`~authentik.stages.authenticator.models.Device.generate_challenge` has been + overridden, but subclasses are welcome to provide smarter + implementations. + + :rtype: bool + """ + return not hasattr(self.generate_challenge, "stub") + + def generate_challenge(self): + """ + Generates a challenge value that the user will need to produce a token. + This method is permitted to have side effects, such as transmitting + information to the user through some other channel (email or SMS, + perhaps). And, of course, some devices may need to commit the + challenge to the database. + + :returns: A message to the user. This should be a string that fits + comfortably in the template ``'OTP Challenge: {0}'``. This may + return ``None`` if this device is not interactive. + :rtype: string or ``None`` + + :raises: Any :exc:`~exceptions.Exception` is permitted. Callers should + trap ``Exception`` and report it to the user. + """ + return None + + generate_challenge.stub = True + + def verify_is_allowed(self): + """ + Checks whether it is permissible to call :meth:`verify_token`. If it is + allowed, returns ``(True, None)``. Otherwise returns ``(False, + data_dict)``, where ``data_dict`` contains extra information, defined + by the implementation. + + This method can be used to implement throttling or locking, for + example. Client code should check this method before calling + :meth:`verify_token` and report problems to the user. + + To report specific problems, the data dictionary can return include a + ``'reason'`` member with a value from the constants in + :class:`VerifyNotAllowed`. Otherwise, an ``'error_message'`` member + should be provided with an error message. + + :meth:`verify_token` should also call this method and return False if + verification is not allowed. + + :rtype: (bool, dict or ``None``) + + """ + return (True, None) + + def verify_token(self, token): + """ + Verifies a token. As a rule, the token should no longer be valid if + this returns ``True``. + + :param str token: The OTP token provided by the user. + :rtype: bool + """ + return False + + +class SideChannelDevice(Device): + """ + Abstract base model for a side-channel :term:`device` attached to a user. + + This model implements token generation, verification and expiration, so the + concrete devices only have to implement delivery. + + """ + + token = models.CharField(max_length=16, blank=True, null=True) + + valid_until = models.DateTimeField( + default=timezone.now, + help_text="The timestamp of the moment of expiry of the saved token.", + ) + + class Meta: + abstract = True + + def generate_token(self, length=6, valid_secs=300, commit=True): + """ + Generates a token of the specified length, then sets it on the model + and sets the expiration of the token on the model. + + Pass 'commit=False' to avoid calling self.save(). + + :param int length: Number of decimal digits in the generated token. + :param int valid_secs: Amount of seconds the token should be valid. + :param bool commit: Whether to autosave the generated token. + + """ + self.token = random_number_token(length) + self.valid_until = timezone.now() + timedelta(seconds=valid_secs) + if commit: + self.save() + + def verify_token(self, token): + """ + Verifies a token by content and expiry. + + On success, the token is cleared and the device saved. + + :param str token: The OTP token provided by the user. + :rtype: bool + + """ + _now = timezone.now() + + if (self.token is not None) and (token == self.token) and (_now < self.valid_until): + self.token = None + self.valid_until = _now + self.save() + + return True + return False + + +class VerifyNotAllowed: + """ + Constants that may be returned in the ``reason`` member of the extra + information dictionary returned by + :meth:`~authentik.stages.authenticator.models.Device.verify_is_allowed` + + .. data:: N_FAILED_ATTEMPTS + + Indicates that verification is disallowed because of ``n`` successive + failed attempts. The data dictionary should include the value of ``n`` + in member ``failure_count`` + + """ + + N_FAILED_ATTEMPTS = "N_FAILED_ATTEMPTS" + + +class ThrottlingMixin(models.Model): + """ + Mixin class for models that want throttling behaviour. + + This implements exponential back-off for verifying tokens. Subclasses must + implement :meth:`get_throttle_factor`, and must use the + :meth:`verify_is_allowed`, :meth:`throttle_reset` and + :meth:`throttle_increment` methods from within their verify_token() method. + + See the implementation of + :class:`~authentik.stages.authenticator.plugins.otp_email.models.EmailDevice` for an example. + + """ + + throttling_failure_timestamp = models.DateTimeField( + null=True, + blank=True, + default=None, + help_text=( + "A timestamp of the last failed verification attempt. " + "Null if last attempt succeeded." + ), + ) + + throttling_failure_count = models.PositiveIntegerField( + default=0, help_text="Number of successive failed attempts." + ) + + def verify_is_allowed(self): + """ + If verification is allowed, returns ``(True, None)``. + Otherwise, returns ``(False, data_dict)``. + + ``data_dict`` contains further information. Currently it can be:: + + { + 'reason': VerifyNotAllowed.N_FAILED_ATTEMPTS, + 'failure_count': n + } + + where ``n`` is the number of successive failures. See + :class:`~authentik.stages.authenticator.models.VerifyNotAllowed`. + + """ + if ( + self.throttling_enabled + and self.throttling_failure_count > 0 + and self.throttling_failure_timestamp is not None + ): + now = timezone.now() + delay = (now - self.throttling_failure_timestamp).total_seconds() + # Required delays should be 1, 2, 4, 8 ... + delay_required = self.get_throttle_factor() * (2 ** (self.throttling_failure_count - 1)) + if delay < delay_required: + return ( + False, + { + "reason": VerifyNotAllowed.N_FAILED_ATTEMPTS, + "failure_count": self.throttling_failure_count, + "locked_until": self.throttling_failure_timestamp + + timedelta(seconds=delay_required), + }, + ) + + return super().verify_is_allowed() + + def throttle_reset(self, commit=True): + """ + Call this method to reset throttling (normally when a verify attempt + succeeded). + + Pass 'commit=False' to avoid calling self.save(). + + """ + self.throttling_failure_timestamp = None + self.throttling_failure_count = 0 + if commit: + self.save() + + def throttle_increment(self, commit=True): + """ + Call this method to increase throttling (normally when a verify attempt + failed). + + Pass 'commit=False' to avoid calling self.save(). + + """ + self.throttling_failure_timestamp = timezone.now() + self.throttling_failure_count += 1 + if commit: + self.save() + + @cached_property + def throttling_enabled(self) -> bool: + """Check if throttling is enabled""" + return self.get_throttle_factor() > 0 + + def get_throttle_factor(self): # pragma: no cover + """ + This must be implemented to return the throttle factor. + + The number of seconds required between verification attempts will be + :math:`c2^{n-1}` where `c` is this factor and `n` is the number of + previous failures. A factor of 1 translates to delays of 1, 2, 4, 8, + etc. seconds. A factor of 0 disables the throttling. + + Normally this is just a wrapper for a plugin-specific setting like + :setting:`OTP_EMAIL_THROTTLE_FACTOR`. + + """ + raise NotImplementedError() + + class Meta: + abstract = True diff --git a/authentik/stages/authenticator/oath.py b/authentik/stages/authenticator/oath.py new file mode 100644 index 000000000..443079067 --- /dev/null +++ b/authentik/stages/authenticator/oath.py @@ -0,0 +1,199 @@ +"""OATH helpers""" +import hmac +from hashlib import sha1 +from struct import pack +from time import time + + +# pylint: disable=invalid-name +def hotp(key: bytes, counter: int, digits=6) -> int: + """ + Implementation of the HOTP algorithm from `RFC 4226 + `_. + + :param bytes key: The shared secret. A 20-byte string is recommended. + :param int counter: The password counter. + :param int digits: The number of decimal digits to generate. + + :returns: The HOTP token. + :rtype: int + + >>> key = b'12345678901234567890' + >>> for c in range(10): + ... hotp(key, c) + 755224 + 287082 + 359152 + 969429 + 338314 + 254676 + 287922 + 162583 + 399871 + 520489 + """ + msg = pack(b">Q", counter) + hs = hmac.new(key, msg, sha1).digest() + hs = list(iter(hs)) + + offset = hs[19] & 0x0F + bin_code = ( + (hs[offset] & 0x7F) << 24 | hs[offset + 1] << 16 | hs[offset + 2] << 8 | hs[offset + 3] + ) + return bin_code % pow(10, digits) + + +def totp(key: bytes, step=30, t0=0, digits=6, drift=0) -> int: + """ + Implementation of the TOTP algorithm from `RFC 6238 + `_. + + :param bytes key: The shared secret. A 20-byte string is recommended. + :param int step: The time step in seconds. The time-based code changes + every ``step`` seconds. + :param int t0: The Unix time at which to start counting time steps. + :param int digits: The number of decimal digits to generate. + :param int drift: The number of time steps to add or remove. Delays and + clock differences might mean that you have to look back or forward a + step or two in order to match a token. + + :returns: The TOTP token. + :rtype: int + + >>> key = b'12345678901234567890' + >>> now = int(time()) + >>> for delta in range(0, 200, 20): + ... totp(key, t0=(now-delta)) + 755224 + 755224 + 287082 + 359152 + 359152 + 969429 + 338314 + 338314 + 254676 + 287922 + """ + return TOTP(key, step, t0, digits, drift).token() + + +class TOTP: + """ + An alternate TOTP interface. + + This provides access to intermediate steps of the computation. This is a + living object: the return values of ``t`` and ``token`` will change along + with other properties and with the passage of time. + + :param bytes key: The shared secret. A 20-byte string is recommended. + :param int step: The time step in seconds. The time-based code changes + every ``step`` seconds. + :param int t0: The Unix time at which to start counting time steps. + :param int digits: The number of decimal digits to generate. + :param int drift: The number of time steps to add or remove. Delays and + clock differences might mean that you have to look back or forward a + step or two in order to match a token. + + >>> key = b'12345678901234567890' + >>> totp = TOTP(key) + >>> totp.time = 0 + >>> totp.t() + 0 + >>> totp.token() + 755224 + >>> totp.time = 30 + >>> totp.t() + 1 + >>> totp.token() + 287082 + >>> totp.verify(287082) + True + >>> totp.verify(359152) + False + >>> totp.verify(359152, tolerance=1) + True + >>> totp.drift + 1 + >>> totp.drift = 0 + >>> totp.verify(359152, tolerance=1, min_t=3) + False + >>> totp.drift + 0 + >>> del totp.time + >>> totp.t0 = int(time()) - 60 + >>> totp.t() + 2 + >>> totp.token() + 359152 + """ + + # pylint: disable=too-many-arguments + def __init__(self, key: bytes, step=30, t0=0, digits=6, drift=0): + self.key = key + self.step = step + self.t0 = t0 + self.digits = digits + self.drift = drift + self._time = None + + def token(self): + """The computed TOTP token.""" + return hotp(self.key, self.t(), digits=self.digits) + + def t(self): + """The computed time step.""" + return ((int(self.time) - self.t0) // self.step) + self.drift + + @property + def time(self): + """ + The current time. + + By default, this returns time.time() each time it is accessed. If you + want to generate a token at a specific time, you can set this property + to a fixed value instead. Deleting the value returns it to its 'live' + state. + + """ + return self._time if (self._time is not None) else time() + + @time.setter + def time(self, value): + self._time = value + + @time.deleter + def time(self): + self._time = None + + def verify(self, token, tolerance=0, min_t=None): + """ + A high-level verification helper. + + :param int token: The provided token. + :param int tolerance: The amount of clock drift you're willing to + accommodate, in steps. We'll look for the token at t values in + [t - tolerance, t + tolerance]. + :param int min_t: The minimum t value we'll accept. As a rule, this + should be one larger than the largest t value of any previously + accepted token. + :rtype: bool + + Iff this returns True, `self.drift` will be updated to reflect the + drift value that was necessary to match the token. + + """ + drift_orig = self.drift + verified = False + + for offset in range(-tolerance, tolerance + 1): + self.drift = drift_orig + offset + if (min_t is not None) and (self.t() < min_t): + continue + if self.token() == token: + verified = True + break + else: + self.drift = drift_orig + + return verified diff --git a/authentik/stages/authenticator/tests.py b/authentik/stages/authenticator/tests.py new file mode 100644 index 000000000..9a619828a --- /dev/null +++ b/authentik/stages/authenticator/tests.py @@ -0,0 +1,220 @@ +"""Base authenticator tests""" +from datetime import timedelta +from threading import Thread + +from django.contrib.auth.models import AnonymousUser +from django.db import connection +from django.test import TestCase, TransactionTestCase +from django.test.utils import override_settings +from django.utils import timezone +from freezegun import freeze_time + +from authentik.core.tests.utils import create_test_admin_user +from authentik.lib.generators import generate_id +from authentik.stages.authenticator import match_token, user_has_device, verify_token +from authentik.stages.authenticator.models import Device, VerifyNotAllowed + + +class TestThread(Thread): + "Django testing quirk: threads have to close their DB connections." + + __test__ = False + + def run(self): + super().run() + connection.close() + + +class ThrottlingTestMixin: + """ + Generic tests for throttled devices. + + Any concrete device implementation that uses throttling should define a + TestCase subclass that includes this as a base class. This will help verify + a correct integration of ThrottlingMixin. + + Subclasses are responsible for populating self.device with a device to test + as well as implementing methods to generate tokens to test with. + + """ + + device: Device + + def valid_token(self): + """Returns a valid token to pass to our device under test.""" + raise NotImplementedError() + + def invalid_token(self): + """Returns an invalid token to pass to our device under test.""" + raise NotImplementedError() + + # + # Tests + # + + def test_delay_imposed_after_fail(self): + """Test delay imposed after fail""" + verified1 = self.device.verify_token(self.invalid_token()) + self.assertFalse(verified1) + verified2 = self.device.verify_token(self.valid_token()) + self.assertFalse(verified2) + + def test_delay_after_fail_expires(self): + """Test delay after fail expires""" + verified1 = self.device.verify_token(self.invalid_token()) + self.assertFalse(verified1) + with freeze_time() as frozen_time: + # With default settings initial delay is 1 second + frozen_time.tick(delta=timedelta(seconds=1.1)) + verified2 = self.device.verify_token(self.valid_token()) + self.assertTrue(verified2) + + def test_throttling_failure_count(self): + """Test throttling failure count""" + self.assertEqual(self.device.throttling_failure_count, 0) + for _ in range(0, 5): + self.device.verify_token(self.invalid_token()) + # Only the first attempt will increase throttling_failure_count, + # the others will all be within 1 second of first + # and therefore not count as attempts. + self.assertEqual(self.device.throttling_failure_count, 1) + + def test_verify_is_allowed(self): + """Test verify allowed""" + # Initially should be allowed + verify_is_allowed1, data1 = self.device.verify_is_allowed() + self.assertEqual(verify_is_allowed1, True) + self.assertEqual(data1, None) + + # After failure, verify is not allowed + with freeze_time(): + self.device.verify_token(self.invalid_token()) + verify_is_allowed2, data2 = self.device.verify_is_allowed() + self.assertEqual(verify_is_allowed2, False) + self.assertEqual( + data2, + { + "reason": VerifyNotAllowed.N_FAILED_ATTEMPTS, + "failure_count": 1, + "locked_until": timezone.now() + timezone.timedelta(seconds=1), + }, + ) + + # After a successful attempt, should be allowed again + with freeze_time() as frozen_time: + frozen_time.tick(delta=timedelta(seconds=1.1)) + self.device.verify_token(self.valid_token()) + + verify_is_allowed3, data3 = self.device.verify_is_allowed() + self.assertEqual(verify_is_allowed3, True) + self.assertEqual(data3, None) + + +@override_settings(OTP_STATIC_THROTTLE_FACTOR=0) +class APITestCase(TestCase): + """Test API""" + + def setUp(self): + self.alice = create_test_admin_user("alice") + self.bob = create_test_admin_user("bob") + device = self.alice.staticdevice_set.create() + self.valid = generate_id(length=16) + device.token_set.create(token=self.valid) + + def test_user_has_device(self): + """Test user_has_device""" + with self.subTest(user="anonymous"): + self.assertFalse(user_has_device(AnonymousUser())) + with self.subTest(user="alice"): + self.assertTrue(user_has_device(self.alice)) + with self.subTest(user="bob"): + self.assertFalse(user_has_device(self.bob)) + + def test_verify_token(self): + """Test verify_token""" + device = self.alice.staticdevice_set.first() + + verified = verify_token(self.alice, device.persistent_id, "bogus") + self.assertIsNone(verified) + + verified = verify_token(self.alice, device.persistent_id, self.valid) + self.assertIsNotNone(verified) + + def test_match_token(self): + """Test match_token""" + verified = match_token(self.alice, "bogus") + self.assertIsNone(verified) + + verified = match_token(self.alice, self.valid) + self.assertEqual(verified, self.alice.staticdevice_set.first()) + + +@override_settings(OTP_STATIC_THROTTLE_FACTOR=0) +class ConcurrencyTestCase(TransactionTestCase): + """Test concurrent verifications""" + + def setUp(self): + self.alice = create_test_admin_user("alice") + self.bob = create_test_admin_user("bob") + self.valid = generate_id(length=16) + for user in [self.alice, self.bob]: + device = user.staticdevice_set.create() + device.token_set.create(token=self.valid) + + def test_verify_token(self): + """Test verify_token in a thread""" + + class VerifyThread(Thread): + """Verifier thread""" + + __test__ = False + + def __init__(self, user, device_id, token): + super().__init__() + + self.user = user + self.device_id = device_id + self.token = token + + self.verified = None + + def run(self): + self.verified = verify_token(self.user, self.device_id, self.token) + connection.close() + + device = self.alice.staticdevice_set.get() + threads = [VerifyThread(device.user, device.persistent_id, self.valid) for _ in range(10)] + for thread in threads: + thread.start() + for thread in threads: + thread.join() + + self.assertEqual(sum(1 for t in threads if t.verified is not None), 1) + + def test_match_token(self): + """Test match_token in a thread""" + + class VerifyThread(Thread): + """Verifier thread""" + + __test__ = False + + def __init__(self, user, token): + super().__init__() + + self.user = user + self.token = token + + self.verified = None + + def run(self): + self.verified = match_token(self.user, self.token) + connection.close() + + threads = [VerifyThread(self.alice, self.valid) for _ in range(10)] + for thread in threads: + thread.start() + for thread in threads: + thread.join() + + self.assertEqual(sum(1 for t in threads if t.verified is not None), 1) diff --git a/authentik/stages/authenticator/util.py b/authentik/stages/authenticator/util.py new file mode 100644 index 000000000..26b9dc64d --- /dev/null +++ b/authentik/stages/authenticator/util.py @@ -0,0 +1,86 @@ +"""Authenticator utils""" +import random +import string +from binascii import unhexlify +from os import urandom + +from django.core.exceptions import ValidationError + + +def hex_validator(length=0): + """ + Returns a function to be used as a model validator for a hex-encoded + CharField. This is useful for secret keys of all kinds:: + + def key_validator(value): + return hex_validator(20)(value) + + key = models.CharField(max_length=40, + validators=[key_validator], help_text='A hex-encoded 20-byte secret key') + + :param int length: If greater than 0, validation will fail unless the + decoded value is exactly this number of bytes. + + :rtype: function + + >>> hex_validator()('0123456789abcdef') + >>> hex_validator(8)(b'0123456789abcdef') + >>> hex_validator()('phlebotinum') # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValidationError: ['phlebotinum is not valid hex-encoded data.'] + >>> hex_validator(9)('0123456789abcdef') # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValidationError: ['0123456789abcdef does not represent exactly 9 bytes.'] + """ + + def _validator(value): + try: + if isinstance(value, str): + value = value.encode() + + unhexlify(value) + except Exception: + raise ValidationError("{0} is not valid hex-encoded data.".format(value)) + + if (length > 0) and (len(value) != length * 2): + raise ValidationError("{0} does not represent exactly {1} bytes.".format(value, length)) + + return _validator + + +def random_hex(length=20): + """ + Returns a string of random bytes encoded as hex. + + This uses :func:`os.urandom`, so it should be suitable for generating + cryptographic keys. + + :param int length: The number of (decoded) bytes to return. + + :returns: A string of hex digits. + :rtype: str + + """ + return urandom(length).hex() + + +def random_number_token(length=6): + """ + Returns a string of random digits encoded as string. + + :param int length: The number of digits to return. + + :returns: A string of decimal digits. + :rtype: str + + """ + rand = random.SystemRandom() + + if hasattr(rand, "choices"): + digits = rand.choices(string.digits, k=length) + else: + digits = (rand.choice(string.digits) for i in range(length)) + + return "".join(digits) diff --git a/authentik/stages/authenticator_duo/models.py b/authentik/stages/authenticator_duo/models.py index ecd5a694e..d1dce81f0 100644 --- a/authentik/stages/authenticator_duo/models.py +++ b/authentik/stages/authenticator_duo/models.py @@ -5,7 +5,6 @@ from django.contrib.auth import get_user_model from django.db import models from django.utils.translation import gettext_lazy as _ from django.views import View -from django_otp.models import Device from duo_client.admin import Admin from duo_client.auth import Auth from rest_framework.serializers import BaseSerializer, Serializer @@ -14,6 +13,7 @@ from authentik.core.types import UserSettingSerializer from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage from authentik.lib.models import SerializerModel from authentik.lib.utils.http import authentik_user_agent +from authentik.stages.authenticator.models import Device class AuthenticatorDuoStage(ConfigurableStage, FriendlyNamedStage, Stage): diff --git a/authentik/stages/authenticator_sms/models.py b/authentik/stages/authenticator_sms/models.py index 65e842d55..7a9658964 100644 --- a/authentik/stages/authenticator_sms/models.py +++ b/authentik/stages/authenticator_sms/models.py @@ -6,7 +6,6 @@ from django.contrib.auth import get_user_model from django.db import models from django.utils.translation import gettext_lazy as _ from django.views import View -from django_otp.models import SideChannelDevice from requests.exceptions import RequestException from rest_framework.exceptions import ValidationError from rest_framework.serializers import BaseSerializer @@ -21,6 +20,7 @@ from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage from authentik.lib.models import SerializerModel from authentik.lib.utils.errors import exception_to_string from authentik.lib.utils.http import get_http_session +from authentik.stages.authenticator.models import SideChannelDevice LOGGER = get_logger() diff --git a/authentik/stages/authenticator_static/api.py b/authentik/stages/authenticator_static/api.py index d009b9feb..d9f474eb1 100644 --- a/authentik/stages/authenticator_static/api.py +++ b/authentik/stages/authenticator_static/api.py @@ -1,6 +1,5 @@ """AuthenticatorStaticStage API Views""" from django_filters.rest_framework import DjangoFilterBackend -from django_otp.plugins.otp_static.models import StaticDevice, StaticToken from rest_framework import mixins from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.permissions import IsAdminUser @@ -10,7 +9,11 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet from authentik.api.authorization import OwnerFilter, OwnerPermissions from authentik.core.api.used_by import UsedByMixin from authentik.flows.api.stages import StageSerializer -from authentik.stages.authenticator_static.models import AuthenticatorStaticStage +from authentik.stages.authenticator_static.models import ( + AuthenticatorStaticStage, + StaticDevice, + StaticToken, +) class AuthenticatorStaticStageSerializer(StageSerializer): diff --git a/authentik/stages/authenticator_static/migrations/0008_initial.py b/authentik/stages/authenticator_static/migrations/0008_initial.py new file mode 100644 index 000000000..44257f5db --- /dev/null +++ b/authentik/stages/authenticator_static/migrations/0008_initial.py @@ -0,0 +1,70 @@ +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ( + "authentik_stages_authenticator_static", + "0007_authenticatorstaticstage_token_length_and_more", + ), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="StaticDevice", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", serialize=False, auto_created=True, primary_key=True + ), + ), + ( + "name", + models.CharField( + help_text="The human-readable name of this device.", max_length=64 + ), + ), + ( + "confirmed", + models.BooleanField(default=True, help_text="Is this device ready for use?"), + ), + ( + "user", + models.ForeignKey( + help_text="The user that this device belongs to.", + to=settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + ), + ), + ], + options={ + "abstract": False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name="StaticToken", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", serialize=False, auto_created=True, primary_key=True + ), + ), + ("token", models.CharField(max_length=16, db_index=True)), + ( + "device", + models.ForeignKey( + related_name="token_set", + to="authentik_stages_authenticator_static.staticdevice", + on_delete=models.CASCADE, + ), + ), + ], + options={}, + bases=(models.Model,), + ), + ] diff --git a/authentik/stages/authenticator_static/migrations/0009_throttling.py b/authentik/stages/authenticator_static/migrations/0009_throttling.py new file mode 100644 index 000000000..17690de2e --- /dev/null +++ b/authentik/stages/authenticator_static/migrations/0009_throttling.py @@ -0,0 +1,33 @@ +# Generated by Django 3.0.5 on 2020-04-16 13:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_stages_authenticator_static", "0008_initial"), + ] + + operations = [ + migrations.AddField( + model_name="staticdevice", + name="throttling_failure_count", + field=models.PositiveIntegerField( + default=0, help_text="Number of successive failed attempts." + ), + ), + migrations.AddField( + model_name="staticdevice", + name="throttling_failure_timestamp", + field=models.DateTimeField( + blank=True, + default=None, + help_text="A timestamp of the last failed verification attempt. Null if last attempt succeeded.", + null=True, + ), + ), + migrations.AlterModelOptions( + name="staticdevice", + options={"verbose_name": "Static device", "verbose_name_plural": "Static devices"}, + ), + ] diff --git a/authentik/stages/authenticator_static/models.py b/authentik/stages/authenticator_static/models.py index 05511c489..ac8b55b08 100644 --- a/authentik/stages/authenticator_static/models.py +++ b/authentik/stages/authenticator_static/models.py @@ -1,6 +1,9 @@ """Static Authenticator models""" +from base64 import b32encode +from os import urandom from typing import Optional +from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ from django.views import View @@ -8,6 +11,8 @@ from rest_framework.serializers import BaseSerializer from authentik.core.types import UserSettingSerializer from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage +from authentik.lib.models import SerializerModel +from authentik.stages.authenticator.models import Device, ThrottlingMixin class AuthenticatorStaticStage(ConfigurableStage, FriendlyNamedStage, Stage): @@ -46,3 +51,76 @@ class AuthenticatorStaticStage(ConfigurableStage, FriendlyNamedStage, Stage): class Meta: verbose_name = _("Static Authenticator Stage") verbose_name_plural = _("Static Authenticator Stages") + + +class StaticDevice(SerializerModel, ThrottlingMixin, Device): + """ + A static :class:`~authentik.stages.authenticator.models.Device` simply consists of random + tokens shared by the database and the user. + + These are frequently used as emergency tokens in case a user's normal + device is lost or unavailable. They can be consumed in any order; each + token will be removed from the database as soon as it is used. + + This model has no fields of its own, but serves as a container for + :class:`StaticToken` objects. + + .. attribute:: token_set + + The RelatedManager for our tokens. + + """ + + @property + def serializer(self) -> type[BaseSerializer]: + from authentik.stages.authenticator_static.api import StaticDeviceSerializer + + return StaticDeviceSerializer + + def get_throttle_factor(self): + return getattr(settings, "OTP_STATIC_THROTTLE_FACTOR", 1) + + def verify_token(self, token): + verify_allowed, _ = self.verify_is_allowed() + if verify_allowed: + match = self.token_set.filter(token=token).first() + if match is not None: + match.delete() + self.throttle_reset() + else: + self.throttle_increment() + else: + match = None + + return match is not None + + class Meta(Device.Meta): + verbose_name = _("Static device") + verbose_name_plural = _("Static devices") + + +class StaticToken(models.Model): + """ + A single token belonging to a :class:`StaticDevice`. + + .. attribute:: device + + *ForeignKey*: A foreign key to :class:`StaticDevice`. + + .. attribute:: token + + *CharField*: A random string up to 16 characters. + """ + + device = models.ForeignKey(StaticDevice, related_name="token_set", on_delete=models.CASCADE) + token = models.CharField(max_length=16, db_index=True) + + @staticmethod + def random_token(): + """ + Returns a new random string that can be used as a static token. + + :rtype: bytes + + """ + return b32encode(urandom(5)).decode("utf-8").lower() diff --git a/authentik/stages/authenticator_static/settings.py b/authentik/stages/authenticator_static/settings.py deleted file mode 100644 index 24b347ccc..000000000 --- a/authentik/stages/authenticator_static/settings.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Static Authenticator settings""" - -INSTALLED_APPS = [ - "django_otp.plugins.otp_static", -] diff --git a/authentik/stages/authenticator_static/signals.py b/authentik/stages/authenticator_static/signals.py index 81f2ac14d..5b0428eef 100644 --- a/authentik/stages/authenticator_static/signals.py +++ b/authentik/stages/authenticator_static/signals.py @@ -1,9 +1,9 @@ """totp authenticator signals""" from django.db.models.signals import pre_delete from django.dispatch import receiver -from django_otp.plugins.otp_static.models import StaticDevice from authentik.events.models import Event +from authentik.stages.authenticator_static.models import StaticDevice @receiver(pre_delete, sender=StaticDevice) diff --git a/authentik/stages/authenticator_static/stage.py b/authentik/stages/authenticator_static/stage.py index 8df9ab4b5..47efbfad7 100644 --- a/authentik/stages/authenticator_static/stage.py +++ b/authentik/stages/authenticator_static/stage.py @@ -1,12 +1,15 @@ """Static OTP Setup stage""" from django.http import HttpRequest, HttpResponse -from django_otp.plugins.otp_static.models import StaticDevice, StaticToken from rest_framework.fields import CharField, ListField from authentik.flows.challenge import ChallengeResponse, ChallengeTypes, WithUserInfoChallenge from authentik.flows.stage import ChallengeStageView from authentik.lib.generators import generate_id -from authentik.stages.authenticator_static.models import AuthenticatorStaticStage +from authentik.stages.authenticator_static.models import ( + AuthenticatorStaticStage, + StaticDevice, + StaticToken, +) SESSION_STATIC_DEVICE = "static_device" SESSION_STATIC_TOKENS = "static_device_tokens" diff --git a/authentik/stages/authenticator_static/tests.py b/authentik/stages/authenticator_static/tests.py index 763cfd90c..92e40f752 100644 --- a/authentik/stages/authenticator_static/tests.py +++ b/authentik/stages/authenticator_static/tests.py @@ -1,9 +1,13 @@ """Test Static API""" +from django.test.utils import override_settings from django.urls import reverse -from django_otp.plugins.otp_static.models import StaticDevice from rest_framework.test import APITestCase from authentik.core.models import User +from authentik.core.tests.utils import create_test_admin_user +from authentik.lib.generators import generate_id +from authentik.stages.authenticator.tests import TestCase, ThrottlingTestMixin +from authentik.stages.authenticator_static.models import StaticDevice class AuthenticatorStaticStageTests(APITestCase): @@ -18,3 +22,42 @@ class AuthenticatorStaticStageTests(APITestCase): reverse("authentik_api:staticdevice-detail", kwargs={"pk": dev.pk}) ) self.assertEqual(response.status_code, 204) + + +class DeviceTest(TestCase): + """A few generic tests to get us started.""" + + def setUp(self): + self.user = create_test_admin_user("alice") + + def test_str(self): + """Test __str__ of model""" + device = StaticDevice.objects.create(user=self.user, name="Device") + + str(device) + + def test_str_unpopulated(self): + """Test __str__ of model""" + device = StaticDevice() + + str(device) + + +@override_settings( + OTP_STATIC_THROTTLE_FACTOR=1, +) +class ThrottlingTestCase(ThrottlingTestMixin, TestCase): + """Test static device throttling""" + + def setUp(self): + user = create_test_admin_user("alice") + self.device = user.staticdevice_set.create() + self.device.token_set.create(token=generate_id(length=16)) + self.device.token_set.create(token=generate_id(length=16)) + self.device.token_set.create(token=generate_id(length=16)) + + def valid_token(self): + return self.device.token_set.first().token + + def invalid_token(self): + return "bogus" diff --git a/authentik/stages/authenticator_totp/api.py b/authentik/stages/authenticator_totp/api.py index 61f596843..df1a379f4 100644 --- a/authentik/stages/authenticator_totp/api.py +++ b/authentik/stages/authenticator_totp/api.py @@ -1,6 +1,5 @@ """AuthenticatorTOTPStage API Views""" from django_filters.rest_framework.backends import DjangoFilterBackend -from django_otp.plugins.otp_totp.models import TOTPDevice from rest_framework import mixins from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.permissions import IsAdminUser @@ -10,7 +9,7 @@ from rest_framework.viewsets import GenericViewSet, ModelViewSet from authentik.api.authorization import OwnerFilter, OwnerPermissions from authentik.core.api.used_by import UsedByMixin from authentik.flows.api.stages import StageSerializer -from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage +from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage, TOTPDevice class AuthenticatorTOTPStageSerializer(StageSerializer): diff --git a/authentik/stages/authenticator_totp/migrations/0008_initial.py b/authentik/stages/authenticator_totp/migrations/0008_initial.py new file mode 100644 index 000000000..3f530d0ec --- /dev/null +++ b/authentik/stages/authenticator_totp/migrations/0008_initial.py @@ -0,0 +1,98 @@ +from django.conf import settings +from django.db import migrations, models + +import authentik.stages.authenticator_totp.models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_stages_authenticator_totp", "0007_authenticatortotpstage_friendly_name"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="TOTPDevice", + fields=[ + ( + "id", + models.AutoField( + verbose_name="ID", serialize=False, auto_created=True, primary_key=True + ), + ), + ( + "name", + models.CharField( + help_text="The human-readable name of this device.", max_length=64 + ), + ), + ( + "confirmed", + models.BooleanField(default=True, help_text="Is this device ready for use?"), + ), + ( + "key", + models.CharField( + default=authentik.stages.authenticator_totp.models.default_key, + help_text="A hex-encoded secret key of up to 40 bytes.", + max_length=80, + validators=[authentik.stages.authenticator_totp.models.key_validator], + ), + ), + ( + "step", + models.PositiveSmallIntegerField( + default=30, help_text="The time step in seconds." + ), + ), + ( + "t0", + models.BigIntegerField( + default=0, help_text="The Unix time at which to begin counting steps." + ), + ), + ( + "digits", + models.PositiveSmallIntegerField( + default=6, + help_text="The number of digits to expect in a token.", + choices=[(6, 6), (8, 8)], + ), + ), + ( + "tolerance", + models.PositiveSmallIntegerField( + default=1, + help_text="The number of time steps in the past or future to allow.", + ), + ), + ( + "drift", + models.SmallIntegerField( + default=0, + help_text="The number of time steps the prover is known to deviate from our clock.", + ), + ), + ( + "last_t", + models.BigIntegerField( + default=-1, + help_text="The t value of the latest verified token. The next token must be at a higher time step.", + ), + ), + ( + "user", + models.ForeignKey( + help_text="The user that this device belongs to.", + to=settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + ), + ), + ], + options={ + "abstract": False, + "verbose_name": "TOTP device", + }, + bases=(models.Model,), + ), + ] diff --git a/authentik/stages/authenticator_totp/migrations/0009_auto_20190420_0723.py b/authentik/stages/authenticator_totp/migrations/0009_auto_20190420_0723.py new file mode 100644 index 000000000..00a7a385e --- /dev/null +++ b/authentik/stages/authenticator_totp/migrations/0009_auto_20190420_0723.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2 on 2019-04-20 12:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_stages_authenticator_totp", "0008_initial"), + ] + + operations = [ + migrations.AddField( + model_name="totpdevice", + name="throttling_failure_count", + field=models.PositiveIntegerField( + default=0, help_text="Number of successive failed attempts." + ), + ), + migrations.AddField( + model_name="totpdevice", + name="throttling_failure_timestamp", + field=models.DateTimeField( + blank=True, + default=None, + help_text="A timestamp of the last failed verification attempt. Null if last attempt succeeded.", + null=True, + ), + ), + ] diff --git a/authentik/stages/authenticator_totp/migrations/0010_alter_totpdevice_key.py b/authentik/stages/authenticator_totp/migrations/0010_alter_totpdevice_key.py new file mode 100644 index 000000000..436eaa38a --- /dev/null +++ b/authentik/stages/authenticator_totp/migrations/0010_alter_totpdevice_key.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.4 on 2023-09-03 00:55 + +from django.db import migrations, models + +import authentik.stages.authenticator_totp.models + + +class Migration(migrations.Migration): + dependencies = [ + ("authentik_stages_authenticator_totp", "0009_auto_20190420_0723"), + ] + + operations = [ + migrations.AlterField( + model_name="totpdevice", + name="key", + field=models.CharField( + default=authentik.stages.authenticator_totp.models.default_key, + help_text="A hex-encoded secret key of up to 40 bytes.", + max_length=80, + validators=[authentik.stages.authenticator_totp.models.key_validator], + ), + ), + migrations.AlterModelOptions( + name="totpdevice", + options={"verbose_name": "TOTP device", "verbose_name_plural": "TOTP devices"}, + ), + ] diff --git a/authentik/stages/authenticator_totp/models.py b/authentik/stages/authenticator_totp/models.py index 03c84b553..6828a8e2e 100644 --- a/authentik/stages/authenticator_totp/models.py +++ b/authentik/stages/authenticator_totp/models.py @@ -1,6 +1,11 @@ """OTP Time-based models""" +import time +from base64 import b32encode +from binascii import unhexlify from typing import Optional +from urllib.parse import quote, urlencode +from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ from django.views import View @@ -8,10 +13,14 @@ from rest_framework.serializers import BaseSerializer from authentik.core.types import UserSettingSerializer from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage +from authentik.lib.models import SerializerModel +from authentik.stages.authenticator.models import Device, ThrottlingMixin +from authentik.stages.authenticator.oath import TOTP +from authentik.stages.authenticator.util import hex_validator, random_hex class TOTPDigits(models.IntegerChoices): - """OTP Time Digits""" + """OTP Time Digits""" SIX = 6, _("6 digits, widely compatible") EIGHT = 8, _("8 digits, not compatible with apps like Google Authenticator") @@ -52,3 +61,185 @@ class AuthenticatorTOTPStage(ConfigurableStage, FriendlyNamedStage, Stage): class Meta: verbose_name = _("TOTP Authenticator Setup Stage") verbose_name_plural = _("TOTP Authenticator Setup Stages") + + +def default_key(): + """Default TOTP Device key""" + return random_hex(20) + + +def key_validator(value): + """Validate totp key""" + return hex_validator()(value) + + +class TOTPDevice(SerializerModel, ThrottlingMixin, Device): + """ + A generic TOTP :class:`~authentik.stages.authenticator.models.Device`. The model fields mostly + correspond to the arguments to :func:`authentik.stages.authenticator.oath.totp`. They all have + sensible defaults, including the key, which is randomly generated. + + .. attribute:: key + + *CharField*: A hex-encoded secret key of up to 40 bytes. (Default: 20 + random bytes) + + .. attribute:: step + + *PositiveSmallIntegerField*: The time step in seconds. (Default: 30) + + .. attribute:: t0 + + *BigIntegerField*: The Unix time at which to begin counting steps. + (Default: 0) + + .. attribute:: digits + + *PositiveSmallIntegerField*: The number of digits to expect in a token + (6 or 8). (Default: 6) + + .. attribute:: tolerance + + *PositiveSmallIntegerField*: The number of time steps in the past or + future to allow. For example, if this is 1, we'll accept any of three + tokens: the current one, the previous one, and the next one. (Default: + 1) + + .. attribute:: drift + + *SmallIntegerField*: The number of time steps the prover is known to + deviate from our clock. If :setting:`OTP_TOTP_SYNC` is ``True``, we'll + update this any time we match a token that is not the current one. + (Default: 0) + + .. attribute:: last_t + + *BigIntegerField*: The time step of the last verified token. To avoid + verifying the same token twice, this will be updated on each successful + verification. Only tokens at a higher time step will be verified + subsequently. (Default: -1) + + """ + + key = models.CharField( + max_length=80, + validators=[key_validator], + default=default_key, + help_text="A hex-encoded secret key of up to 40 bytes.", + ) + step = models.PositiveSmallIntegerField(default=30, help_text="The time step in seconds.") + t0 = models.BigIntegerField( + default=0, help_text="The Unix time at which to begin counting steps." + ) + digits = models.PositiveSmallIntegerField( + choices=[(6, 6), (8, 8)], + default=6, + help_text="The number of digits to expect in a token.", + ) + tolerance = models.PositiveSmallIntegerField( + default=1, help_text="The number of time steps in the past or future to allow." + ) + drift = models.SmallIntegerField( + default=0, + help_text="The number of time steps the prover is known to deviate from our clock.", + ) + last_t = models.BigIntegerField( + default=-1, + help_text=( + "The t value of the latest verified token. " + "The next token must be at a higher time step." + ), + ) + + @property + def serializer(self) -> type[BaseSerializer]: + from authentik.stages.authenticator_totp.api import TOTPDeviceSerializer + + return TOTPDeviceSerializer + + @property + def bin_key(self): + """ + The secret key as a binary string. + """ + return unhexlify(self.key.encode()) + + def verify_token(self, token): + otp_totp_sync = getattr(settings, "OTP_TOTP_SYNC", True) + + verify_allowed, _ = self.verify_is_allowed() + if not verify_allowed: + return False + + try: + token = int(token) + except ValueError: + verified = False + else: + key = self.bin_key + + totp = TOTP(key, self.step, self.t0, self.digits, self.drift) + totp.time = time.time() + + verified = totp.verify(token, self.tolerance, self.last_t + 1) + if verified: + self.last_t = totp.t() + if otp_totp_sync: + self.drift = totp.drift + self.throttle_reset(commit=False) + self.save() + + if not verified: + self.throttle_increment(commit=True) + + return verified + + def get_throttle_factor(self): + return getattr(settings, "OTP_TOTP_THROTTLE_FACTOR", 1) + + @property + def config_url(self): + """ + A URL for configuring Google Authenticator or similar. + + See https://github.com/google/google-authenticator/wiki/Key-Uri-Format. + The issuer is taken from :setting:`OTP_TOTP_ISSUER`, if available. + The image (for e.g. FreeOTP) is taken from :setting:`OTP_TOTP_IMAGE`, if available. + + """ + label = str(self.user.username) + params = { + "secret": b32encode(self.bin_key), + "algorithm": "SHA1", + "digits": self.digits, + "period": self.step, + } + urlencoded_params = urlencode(params) + + issuer = self._read_str_from_settings("OTP_TOTP_ISSUER") + if issuer: + issuer = issuer.replace(":", "") + label = "{}:{}".format(issuer, label) + urlencoded_params += "&issuer={}".format( + quote(issuer) + ) # encode issuer as per RFC 3986, not quote_plus + + image = self._read_str_from_settings("OTP_TOTP_IMAGE") + if image: + urlencoded_params += "&image={}".format(quote(image, safe=":/")) + + url = "otpauth://totp/{}?{}".format(quote(label), urlencoded_params) + + return url + + def _read_str_from_settings(self, key): + val = getattr(settings, key, None) + if callable(val): + val = val(self) + if isinstance(val, str) and (val != ""): + return val + return None + + class Meta(Device.Meta): + verbose_name = _("TOTP device") + verbose_name_plural = _("TOTP devices") diff --git a/authentik/stages/authenticator_totp/settings.py b/authentik/stages/authenticator_totp/settings.py index 779c43972..dbecf3f20 100644 --- a/authentik/stages/authenticator_totp/settings.py +++ b/authentik/stages/authenticator_totp/settings.py @@ -1,6 +1,3 @@ """OTP Time""" -INSTALLED_APPS = [ - "django_otp.plugins.otp_totp", -] OTP_TOTP_ISSUER = "__to_replace__" diff --git a/authentik/stages/authenticator_totp/stage.py b/authentik/stages/authenticator_totp/stage.py index 80ad8a075..d3b03a34c 100644 --- a/authentik/stages/authenticator_totp/stage.py +++ b/authentik/stages/authenticator_totp/stage.py @@ -4,7 +4,6 @@ from urllib.parse import quote from django.http import HttpRequest, HttpResponse from django.http.request import QueryDict from django.utils.translation import gettext_lazy as _ -from django_otp.plugins.otp_totp.models import TOTPDevice from rest_framework.fields import CharField, IntegerField from rest_framework.serializers import ValidationError @@ -15,7 +14,7 @@ from authentik.flows.challenge import ( WithUserInfoChallenge, ) from authentik.flows.stage import ChallengeStageView -from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage +from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage, TOTPDevice from authentik.stages.authenticator_totp.settings import OTP_TOTP_ISSUER SESSION_TOTP_DEVICE = "totp_device" diff --git a/authentik/stages/authenticator_totp/tests.py b/authentik/stages/authenticator_totp/tests.py index f89745bda..8ee7577ad 100644 --- a/authentik/stages/authenticator_totp/tests.py +++ b/authentik/stages/authenticator_totp/tests.py @@ -1,9 +1,15 @@ """Test TOTP API""" +from time import time +from urllib.parse import parse_qs, urlsplit + +from django.test.utils import override_settings from django.urls import reverse -from django_otp.plugins.otp_totp.models import TOTPDevice from rest_framework.test import APITestCase from authentik.core.models import User +from authentik.core.tests.utils import create_test_admin_user +from authentik.stages.authenticator.tests import TestCase, ThrottlingTestMixin +from authentik.stages.authenticator_totp.models import TOTPDevice class AuthenticatorTOTPStage(APITestCase): @@ -18,3 +24,180 @@ class AuthenticatorTOTPStage(APITestCase): reverse("authentik_api:totpdevice-detail", kwargs={"pk": dev.pk}) ) self.assertEqual(response.status_code, 204) + + +class TOTPDeviceMixin: + """ + A TestCase helper that gives us a TOTPDevice to work with. + """ + + # The next ten tokens + tokens = [ + 179225, + 656163, + 839400, + 154567, + 346912, + 471576, + 45675, + 101397, + 491039, + 784503, + ] + + # pylint: disable=invalid-name + def setUp(self): + """ + Create a device at the fourth time step. The current token is 154567. + """ + self.alice = create_test_admin_user("alice", email="alice@example.com") + self.device = self.alice.totpdevice_set.create( + key="2a2bbba1092ffdd25a328ad1a0a5f5d61d7aacc4", + step=30, + t0=int(time() - (30 * 3)), + digits=6, + tolerance=0, + drift=0, + ) + + +@override_settings( + OTP_TOTP_SYNC=False, + OTP_TOTP_THROTTLE_FACTOR=0, +) +class TOTPTest(TOTPDeviceMixin, TestCase): + """TOTP tests""" + + def test_default_key(self): + """Ensure default_key is valid""" + device = self.alice.totpdevice_set.create() + + # Make sure we can decode the key. + _ = device.bin_key + + def test_single(self): + """Test single token""" + results = [self.device.verify_token(token) for token in self.tokens] + + self.assertEqual(results, [False] * 3 + [True] + [False] * 6) + + def test_tolerance(self): + """Test tolerance""" + self.device.tolerance = 1 + results = [self.device.verify_token(token) for token in self.tokens] + + self.assertEqual(results, [False] * 2 + [True] * 3 + [False] * 5) + + def test_drift(self): + """Test drift""" + self.device.tolerance = 1 + self.device.drift = -1 + results = [self.device.verify_token(token) for token in self.tokens] + + self.assertEqual(results, [False] * 1 + [True] * 3 + [False] * 6) + + def test_sync_drift(self): + """Test sync drift""" + self.device.tolerance = 2 + with self.settings(OTP_TOTP_SYNC=True): + valid = self.device.verify_token(self.tokens[5]) + + self.assertTrue(valid) + self.assertEqual(self.device.drift, 2) + + def test_no_reuse(self): + """Test reuse""" + verified1 = self.device.verify_token(self.tokens[3]) + verified2 = self.device.verify_token(self.tokens[3]) + + self.assertEqual(self.device.last_t, 3) + self.assertTrue(verified1) + self.assertFalse(verified2) + + def test_config_url(self): + """Test config_url""" + with override_settings(OTP_TOTP_ISSUER=None): + url = self.device.config_url + + parsed = urlsplit(url) + params = parse_qs(parsed.query) + + self.assertEqual(parsed.scheme, "otpauth") + self.assertEqual(parsed.netloc, "totp") + self.assertEqual(parsed.path, "/alice") + self.assertIn("secret", params) + self.assertNotIn("issuer", params) + + def test_config_url_issuer(self): + """Test config_url issuer""" + with override_settings(OTP_TOTP_ISSUER="example.com"): + url = self.device.config_url + + parsed = urlsplit(url) + params = parse_qs(parsed.query) + + self.assertEqual(parsed.scheme, "otpauth") + self.assertEqual(parsed.netloc, "totp") + self.assertEqual(parsed.path, "/example.com%3Aalice") + self.assertIn("secret", params) + self.assertIn("issuer", params) + self.assertEqual(params["issuer"][0], "example.com") + + def test_config_url_issuer_spaces(self): + """Test config_url issuer with spaces""" + with override_settings(OTP_TOTP_ISSUER="Very Trustworthy Source"): + url = self.device.config_url + + parsed = urlsplit(url) + params = parse_qs(parsed.query) + + self.assertEqual(parsed.scheme, "otpauth") + self.assertEqual(parsed.netloc, "totp") + self.assertEqual(parsed.path, "/Very%20Trustworthy%20Source%3Aalice") + self.assertIn("secret", params) + self.assertIn("issuer", params) + self.assertEqual(params["issuer"][0], "Very Trustworthy Source") + + def test_config_url_issuer_method(self): + """Test config_url issuer method""" + with override_settings(OTP_TOTP_ISSUER=lambda d: d.user.email): + url = self.device.config_url + + parsed = urlsplit(url) + params = parse_qs(parsed.query) + + self.assertEqual(parsed.scheme, "otpauth") + self.assertEqual(parsed.netloc, "totp") + self.assertEqual(parsed.path, "/alice%40example.com%3Aalice") + self.assertIn("secret", params) + self.assertIn("issuer", params) + self.assertEqual(params["issuer"][0], "alice@example.com") + + def test_config_url_image(self): + """Test config_url with image""" + image_url = "https://test.invalid/square.png" + + with override_settings(OTP_TOTP_ISSUER=None, OTP_TOTP_IMAGE=image_url): + url = self.device.config_url + + parsed = urlsplit(url) + params = parse_qs(parsed.query) + + self.assertEqual(parsed.scheme, "otpauth") + self.assertEqual(parsed.netloc, "totp") + self.assertEqual(parsed.path, "/alice") + self.assertIn("secret", params) + self.assertEqual(params["image"][0], image_url) + + +@override_settings( + OTP_TOTP_THROTTLE_FACTOR=1, +) +class ThrottlingTestCase(TOTPDeviceMixin, ThrottlingTestMixin, TestCase): + """Test TOTP Throttling""" + + def valid_token(self): + return self.tokens[3] + + def invalid_token(self): + return -1 diff --git a/authentik/stages/authenticator_validate/challenge.py b/authentik/stages/authenticator_validate/challenge.py index c8d86bf10..3cd43c07b 100644 --- a/authentik/stages/authenticator_validate/challenge.py +++ b/authentik/stages/authenticator_validate/challenge.py @@ -7,8 +7,6 @@ from django.http.response import Http404 from django.shortcuts import get_object_or_404 from django.utils.translation import gettext as __ from django.utils.translation import gettext_lazy as _ -from django_otp import match_token -from django_otp.models import Device from rest_framework.fields import CharField, JSONField from rest_framework.serializers import ValidationError from structlog.stdlib import get_logger @@ -25,6 +23,8 @@ from authentik.events.models import Event, EventAction from authentik.flows.stage import StageView from authentik.flows.views.executor import SESSION_KEY_APPLICATION_PRE from authentik.lib.utils.http import get_client_ip +from authentik.stages.authenticator import match_token +from authentik.stages.authenticator.models import Device from authentik.stages.authenticator_duo.models import AuthenticatorDuoStage, DuoDevice from authentik.stages.authenticator_sms.models import SMSDevice from authentik.stages.authenticator_validate.models import AuthenticatorValidateStage, DeviceClasses diff --git a/authentik/stages/authenticator_validate/settings.py b/authentik/stages/authenticator_validate/settings.py deleted file mode 100644 index 34902a427..000000000 --- a/authentik/stages/authenticator_validate/settings.py +++ /dev/null @@ -1,4 +0,0 @@ -"""OTP Validate stage settings""" -INSTALLED_APPS = [ - "django_otp", -] diff --git a/authentik/stages/authenticator_validate/stage.py b/authentik/stages/authenticator_validate/stage.py index ff9a1dac6..4b88041e5 100644 --- a/authentik/stages/authenticator_validate/stage.py +++ b/authentik/stages/authenticator_validate/stage.py @@ -5,8 +5,6 @@ from typing import Optional from django.conf import settings from django.http import HttpRequest, HttpResponse -from django_otp import devices_for_user -from django_otp.models import Device from jwt import PyJWTError, decode, encode from rest_framework.fields import CharField, IntegerField, JSONField, ListField, UUIDField from rest_framework.serializers import ValidationError @@ -21,6 +19,8 @@ from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER from authentik.flows.stage import ChallengeStageView from authentik.lib.utils.time import timedelta_from_string from authentik.root.install_id import get_install_id +from authentik.stages.authenticator import devices_for_user +from authentik.stages.authenticator.models import Device from authentik.stages.authenticator_sms.models import SMSDevice from authentik.stages.authenticator_validate.challenge import ( DeviceChallenge, diff --git a/authentik/stages/authenticator_validate/tests/test_totp.py b/authentik/stages/authenticator_validate/tests/test_totp.py index e5ecb7fbc..5873a4f69 100644 --- a/authentik/stages/authenticator_validate/tests/test_totp.py +++ b/authentik/stages/authenticator_validate/tests/test_totp.py @@ -5,8 +5,6 @@ from time import sleep from django.test.client import RequestFactory from django.urls.base import reverse -from django_otp.oath import TOTP -from django_otp.plugins.otp_totp.models import TOTPDevice from jwt import encode from rest_framework.exceptions import ValidationError @@ -17,6 +15,8 @@ from authentik.flows.tests import FlowTestCase from authentik.flows.views.executor import FlowExecutorView from authentik.lib.generators import generate_id from authentik.root.install_id import get_install_id +from authentik.stages.authenticator.oath import TOTP +from authentik.stages.authenticator_totp.models import TOTPDevice from authentik.stages.authenticator_validate.challenge import ( get_challenge_for_device, validate_challenge_code, diff --git a/authentik/stages/authenticator_webauthn/models.py b/authentik/stages/authenticator_webauthn/models.py index e498f2a0b..5f4768195 100644 --- a/authentik/stages/authenticator_webauthn/models.py +++ b/authentik/stages/authenticator_webauthn/models.py @@ -6,7 +6,6 @@ from django.db import models from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django.views import View -from django_otp.models import Device from rest_framework.serializers import BaseSerializer, Serializer from webauthn.helpers.base64url_to_bytes import base64url_to_bytes from webauthn.helpers.structs import PublicKeyCredentialDescriptor @@ -14,6 +13,7 @@ from webauthn.helpers.structs import PublicKeyCredentialDescriptor from authentik.core.types import UserSettingSerializer from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage from authentik.lib.models import SerializerModel +from authentik.stages.authenticator.models import Device class UserVerification(models.TextChoices): diff --git a/authentik/stages/deny/stage.py b/authentik/stages/deny/stage.py index 4e9e93d0c..2b38a299e 100644 --- a/authentik/stages/deny/stage.py +++ b/authentik/stages/deny/stage.py @@ -7,10 +7,6 @@ from authentik.flows.stage import StageView class DenyStageView(StageView): """Cancels the current flow""" - def get(self, request: HttpRequest) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Cancels the current flow""" return self.executor.stage_invalid() - - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) diff --git a/authentik/stages/invitation/stage.py b/authentik/stages/invitation/stage.py index 8c2c59ded..742fde160 100644 --- a/authentik/stages/invitation/stage.py +++ b/authentik/stages/invitation/stage.py @@ -21,10 +21,6 @@ INVITATION = "invitation" class InvitationStageView(StageView): """Finalise Authentication flow by logging the user in""" - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) - def get_token(self) -> Optional[str]: """Get token from saved get-arguments or prompt_data""" # Check for ?token= and ?itoken= @@ -55,7 +51,7 @@ class InvitationStageView(StageView): return None return invite - def get(self, request: HttpRequest) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Apply data to the current flow based on a URL""" stage: InvitationStage = self.executor.current_stage diff --git a/authentik/stages/password/stage.py b/authentik/stages/password/stage.py index 9b87a6691..de80c6725 100644 --- a/authentik/stages/password/stage.py +++ b/authentik/stages/password/stage.py @@ -7,7 +7,7 @@ from django.core.exceptions import PermissionDenied from django.http import HttpRequest, HttpResponse from django.urls import reverse from django.utils.translation import gettext as _ -from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.exceptions import ValidationError from rest_framework.fields import CharField from sentry_sdk.hub import Hub from structlog.stdlib import get_logger @@ -20,6 +20,7 @@ from authentik.flows.challenge import ( ChallengeTypes, WithUserInfoChallenge, ) +from authentik.flows.exceptions import StageInvalidException from authentik.flows.models import Flow, FlowDesignation, Stage from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER from authentik.flows.stage import ChallengeStageView @@ -79,9 +80,52 @@ class PasswordChallenge(WithUserInfoChallenge): class PasswordChallengeResponse(ChallengeResponse): """Password challenge response""" + component = CharField(default="ak-stage-password") + password = CharField(trim_whitespace=False) - component = CharField(default="ak-stage-password") + def validate_password(self, password: str) -> str | None: + """Validate password and authenticate user""" + executor = self.stage.executor + if PLAN_CONTEXT_PENDING_USER not in executor.plan.context: + raise StageInvalidException("No pending user") + # Get the pending user's username, which is used as + # an Identifier by most authentication backends + pending_user: User = executor.plan.context[PLAN_CONTEXT_PENDING_USER] + auth_kwargs = { + "password": password, + "username": pending_user.username, + } + try: + with Hub.current.start_span( + op="authentik.stages.password.authenticate", + description="User authenticate call", + ): + user = authenticate( + self.stage.request, + executor.current_stage.backends, + executor.current_stage, + **auth_kwargs, + ) + except PermissionDenied as exc: + del auth_kwargs["password"] + # User was found, but permission was denied (i.e. user is not active) + self.stage.logger.debug("Denied access", **auth_kwargs) + raise StageInvalidException("Denied access") from exc + except ValidationError as exc: + del auth_kwargs["password"] + # User was found, authentication succeeded, but another signal raised an error + # (most likely LDAP) + self.stage.logger.debug("Validation error from signal", exc=exc, **auth_kwargs) + raise StageInvalidException("Validation error") from exc + if not user: + # No user was found -> invalid credentials + self.stage.logger.info("Invalid credentials") + raise ValidationError(_("Invalid password"), "invalid") + # User instance returned from authenticate() has .backend property set + executor.plan.context[PLAN_CONTEXT_PENDING_USER] = user + executor.plan.context[PLAN_CONTEXT_AUTHENTICATION_BACKEND] = user.backend + return password class PasswordStageView(ChallengeStageView): @@ -111,7 +155,7 @@ class PasswordStageView(ChallengeStageView): current_stage: PasswordStage = self.executor.current_stage if ( self.request.session[SESSION_KEY_INVALID_TRIES] - > current_stage.failed_attempts_before_cancel + >= current_stage.failed_attempts_before_cancel ): self.logger.debug("User has exceeded maximum tries") del self.request.session[SESSION_KEY_INVALID_TRIES] @@ -122,43 +166,4 @@ class PasswordStageView(ChallengeStageView): """Authenticate against django's authentication backend""" if PLAN_CONTEXT_PENDING_USER not in self.executor.plan.context: return self.executor.stage_invalid() - # Get the pending user's username, which is used as - # an Identifier by most authentication backends - pending_user: User = self.executor.plan.context[PLAN_CONTEXT_PENDING_USER] - auth_kwargs = { - "password": response.validated_data.get("password", None), - "username": pending_user.username, - } - try: - with Hub.current.start_span( - op="authentik.stages.password.authenticate", - description="User authenticate call", - ): - user = authenticate( - self.request, - self.executor.current_stage.backends, - self.executor.current_stage, - **auth_kwargs, - ) - except PermissionDenied: - del auth_kwargs["password"] - # User was found, but permission was denied (i.e. user is not active) - self.logger.debug("Denied access", **auth_kwargs) - return self.executor.stage_invalid() - except ValidationError as exc: - del auth_kwargs["password"] - # User was found, authentication succeeded, but another signal raised an error - # (most likely LDAP) - self.logger.debug("Validation error from signal", exc=exc, **auth_kwargs) - return self.executor.stage_invalid() - if not user: - # No user was found -> invalid credentials - self.logger.info("Invalid credentials") - # Manually inject error into form - response._errors.setdefault("password", []) - response._errors["password"].append(ErrorDetail(_("Invalid password"), "invalid")) - return self.challenge_invalid(response) - # User instance returned from authenticate() has .backend property set - self.executor.plan.context[PLAN_CONTEXT_PENDING_USER] = user - self.executor.plan.context[PLAN_CONTEXT_AUTHENTICATION_BACKEND] = user.backend return self.executor.stage_ok() diff --git a/authentik/stages/password/tests.py b/authentik/stages/password/tests.py index 33abe5961..4d8b9a38f 100644 --- a/authentik/stages/password/tests.py +++ b/authentik/stages/password/tests.py @@ -108,7 +108,7 @@ class TestPasswordStage(FlowTestCase): session[SESSION_KEY_PLAN] = plan session.save() - for _ in range(self.stage.failed_attempts_before_cancel): + for _ in range(self.stage.failed_attempts_before_cancel - 1): response = self.client.post( reverse( "authentik_api:flow-executor", @@ -118,6 +118,11 @@ class TestPasswordStage(FlowTestCase): {"password": self.user.username + "test"}, ) self.assertEqual(response.status_code, 200) + self.assertStageResponse( + response, + flow=self.flow, + response_errors={"password": [{"string": "Invalid password", "code": "invalid"}]}, + ) response = self.client.post( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), @@ -127,6 +132,7 @@ class TestPasswordStage(FlowTestCase): self.assertEqual(response.status_code, 200) # To ensure the plan has been cancelled, check SESSION_KEY_PLAN self.assertNotIn(SESSION_KEY_PLAN, self.client.session) + self.assertStageResponse(response, flow=self.flow, error_message="Unknown error") @patch( "authentik.flows.views.executor.to_stage_response", diff --git a/authentik/stages/user_delete/stage.py b/authentik/stages/user_delete/stage.py index 55a1a1711..a17c98add 100644 --- a/authentik/stages/user_delete/stage.py +++ b/authentik/stages/user_delete/stage.py @@ -11,11 +11,7 @@ from authentik.flows.stage import StageView class UserDeleteStageView(StageView): """Finalise unenrollment flow by deleting the user object.""" - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) - - def get(self, request: HttpRequest) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Delete currently pending user""" user = self.get_pending_user() if not user.is_authenticated: diff --git a/authentik/stages/user_login/stage.py b/authentik/stages/user_login/stage.py index e4c27973d..0475c1b84 100644 --- a/authentik/stages/user_login/stage.py +++ b/authentik/stages/user_login/stage.py @@ -41,17 +41,11 @@ class UserLoginStageView(ChallengeStageView): } ) - def post(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: - """Wrapper for post requests""" + def dispatch(self, request: HttpRequest) -> HttpResponse: + """Check for remember_me, and do login""" stage: UserLoginStage = self.executor.current_stage if timedelta_from_string(stage.remember_me_offset).total_seconds() > 0: - return super().post(request, *args, **kwargs) - return self.do_login(request) - - def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: - stage: UserLoginStage = self.executor.current_stage - if timedelta_from_string(stage.remember_me_offset).total_seconds() > 0: - return super().get(request, *args, **kwargs) + return super().dispatch(request) return self.do_login(request) def challenge_valid(self, response: UserLoginChallengeResponse) -> HttpResponse: diff --git a/authentik/stages/user_logout/stage.py b/authentik/stages/user_logout/stage.py index e377c29f6..f0cf80666 100644 --- a/authentik/stages/user_logout/stage.py +++ b/authentik/stages/user_logout/stage.py @@ -8,7 +8,7 @@ from authentik.flows.stage import StageView class UserLogoutStageView(StageView): """Finalise Authentication flow by logging the user in""" - def get(self, request: HttpRequest) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Remove the user from the current session""" self.logger.debug( "Logged out", @@ -17,7 +17,3 @@ class UserLogoutStageView(StageView): ) logout(self.request) return self.executor.stage_ok() - - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) diff --git a/authentik/stages/user_write/stage.py b/authentik/stages/user_write/stage.py index 4de0f8135..98494fae1 100644 --- a/authentik/stages/user_write/stage.py +++ b/authentik/stages/user_write/stage.py @@ -51,10 +51,6 @@ class UserWriteStageView(StageView): attrs = attrs.get(comp) attrs[parts[-1]] = value - def post(self, request: HttpRequest) -> HttpResponse: - """Wrapper for post requests""" - return self.get(request) - def ensure_user(self) -> tuple[Optional[User], bool]: """Ensure a user exists""" user_created = False @@ -127,7 +123,7 @@ class UserWriteStageView(StageView): if connection.source.name not in user.attributes[USER_ATTRIBUTE_SOURCES]: user.attributes[USER_ATTRIBUTE_SOURCES].append(connection.source.name) - def get(self, request: HttpRequest) -> HttpResponse: + def dispatch(self, request: HttpRequest) -> HttpResponse: """Save data in the current flow to the currently pending user. If no user is pending, a new user is created.""" if PLAN_CONTEXT_PROMPT not in self.executor.plan.context: diff --git a/blueprints/schema.json b/blueprints/schema.json index fc14ff613..2ddec653d 100644 --- a/blueprints/schema.json +++ b/blueprints/schema.json @@ -1669,6 +1669,43 @@ } } }, + { + "type": "object", + "required": [ + "model", + "identifiers" + ], + "properties": { + "model": { + "const": "authentik_stages_authenticator_static.staticdevice" + }, + "id": { + "type": "string" + }, + "state": { + "type": "string", + "enum": [ + "absent", + "present", + "created", + "must_created" + ], + "default": "present" + }, + "conditions": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "attrs": { + "$ref": "#/$defs/model_authentik_stages_authenticator_static.staticdevice" + }, + "identifiers": { + "$ref": "#/$defs/model_authentik_stages_authenticator_static.staticdevice" + } + } + }, { "type": "object", "required": [ @@ -1706,6 +1743,43 @@ } } }, + { + "type": "object", + "required": [ + "model", + "identifiers" + ], + "properties": { + "model": { + "const": "authentik_stages_authenticator_totp.totpdevice" + }, + "id": { + "type": "string" + }, + "state": { + "type": "string", + "enum": [ + "absent", + "present", + "created", + "must_created" + ], + "default": "present" + }, + "conditions": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "attrs": { + "$ref": "#/$defs/model_authentik_stages_authenticator_totp.totpdevice" + }, + "identifiers": { + "$ref": "#/$defs/model_authentik_stages_authenticator_totp.totpdevice" + } + } + }, { "type": "object", "required": [ @@ -3303,6 +3377,7 @@ "authentik.sources.oauth", "authentik.sources.plex", "authentik.sources.saml", + "authentik.stages.authenticator", "authentik.stages.authenticator_duo", "authentik.stages.authenticator_sms", "authentik.stages.authenticator_static", @@ -3381,7 +3456,9 @@ "authentik_stages_authenticator_sms.authenticatorsmsstage", "authentik_stages_authenticator_sms.smsdevice", "authentik_stages_authenticator_static.authenticatorstaticstage", + "authentik_stages_authenticator_static.staticdevice", "authentik_stages_authenticator_totp.authenticatortotpstage", + "authentik_stages_authenticator_totp.totpdevice", "authentik_stages_authenticator_validate.authenticatorvalidatestage", "authentik_stages_authenticator_webauthn.authenticatewebauthnstage", "authentik_stages_authenticator_webauthn.webauthndevice", @@ -3646,10 +3723,15 @@ }, "timeout": { "type": "integer", - "minimum": -2147483648, + "minimum": 0, "maximum": 2147483647, "title": "Timeout", "description": "Timeout after which Policy execution is terminated." + }, + "failure_result": { + "type": "boolean", + "title": "Failure result", + "description": "Result if the Policy execution fails." } }, "required": [] @@ -5943,6 +6025,19 @@ }, "required": [] }, + "model_authentik_stages_authenticator_static.staticdevice": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "title": "Name", + "description": "The human-readable name of this device." + } + }, + "required": [] + }, "model_authentik_stages_authenticator_totp.authenticatortotpstage": { "type": "object", "properties": { @@ -6057,6 +6152,19 @@ }, "required": [] }, + "model_authentik_stages_authenticator_totp.totpdevice": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "title": "Name", + "description": "The human-readable name of this device." + } + }, + "required": [] + }, "model_authentik_stages_authenticator_validate.authenticatorvalidatestage": { "type": "object", "properties": { diff --git a/cmd/server/server.go b/cmd/server/server.go index b734a99d4..f80c98544 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -13,7 +13,6 @@ import ( "goauthentik.io/internal/config" "goauthentik.io/internal/constants" "goauthentik.io/internal/debug" - "goauthentik.io/internal/gounicorn" "goauthentik.io/internal/outpost/ak" "goauthentik.io/internal/outpost/proxyv2" sentryutils "goauthentik.io/internal/utils/sentry" @@ -22,8 +21,6 @@ import ( "goauthentik.io/internal/web/tenant_tls" ) -var running = true - var rootCmd = &cobra.Command{ Use: "authentik", Short: "Start authentik instance", @@ -63,40 +60,25 @@ var rootCmd = &cobra.Command{ ex := common.Init() defer common.Defer() - u, _ := url.Parse("http://localhost:8000") - - g := gounicorn.New() - defer func() { - l.Info("shutting down gunicorn") - g.Kill() - }() - ws := web.NewWebServer(g) - g.HealthyCallback = func() { - if !config.Get().Outposts.DisableEmbeddedOutpost { - go attemptProxyStart(ws, u) - } + u, err := url.Parse(fmt.Sprintf("http://%s", config.Get().Listen.HTTP)) + if err != nil { + panic(err) + } + + ws := web.NewWebServer() + ws.Core().HealthyCallback = func() { + if config.Get().Outposts.DisableEmbeddedOutpost { + return + } + go attemptProxyStart(ws, u) } - go web.RunMetricsServer() - go attemptStartBackend(g) ws.Start() <-ex - running = false l.Info("shutting down webserver") go ws.Shutdown() - }, } -func attemptStartBackend(g *gounicorn.GoUnicorn) { - for { - if !running { - return - } - err := g.Start() - log.WithField("logger", "authentik.router").WithError(err).Warning("gunicorn process died, restarting") - } -} - func attemptProxyStart(ws *web.WebServer, u *url.URL) { maxTries := 100 attempt := 0 diff --git a/docker-compose.yml b/docker-compose.yml index 68970fcfa..8cbf644d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,7 +32,7 @@ services: volumes: - redis:/data server: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.8.1} + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.8.3} restart: unless-stopped command: server environment: @@ -53,7 +53,7 @@ services: - postgresql - redis worker: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.8.1} + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.8.3} restart: unless-stopped command: worker environment: diff --git a/go.mod b/go.mod index 68d230a48..2c212348c 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,9 @@ require ( github.com/Netflix/go-env v0.0.0-20210215222557-e437a7e7f9fb github.com/coreos/go-oidc v2.2.1+incompatible github.com/garyburd/redigo v1.6.4 - github.com/getsentry/sentry-go v0.23.0 + github.com/getsentry/sentry-go v0.24.1 github.com/go-http-utils/etag v0.0.0-20161124023236-513ea8f21eb1 - github.com/go-ldap/ldap/v3 v3.4.5 + github.com/go-ldap/ldap/v3 v3.4.6 github.com/go-openapi/runtime v0.26.0 github.com/go-openapi/strfmt v0.21.7 github.com/golang-jwt/jwt v3.2.2+incompatible @@ -26,9 +26,9 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 - goauthentik.io/api/v3 v3.2023081.1 + goauthentik.io/api/v3 v3.2023083.3 golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab - golang.org/x/oauth2 v0.11.0 + golang.org/x/oauth2 v0.12.0 golang.org/x/sync v0.3.0 gopkg.in/boj/redistore.v1 v1.0.0-20160128113310-fc113767cd6b gopkg.in/yaml.v2 v2.4.0 @@ -42,7 +42,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-http-utils/fresh v0.0.0-20161124030543-7231e26a4b27 // indirect github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a // indirect github.com/go-logr/logr v1.2.3 // indirect @@ -73,10 +73,10 @@ require ( go.mongodb.org/mongo-driver v1.11.3 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/square/go-jose.v2 v2.5.1 // indirect diff --git a/go.sum b/go.sum index ac5de0546..269215118 100644 --- a/go.sum +++ b/go.sum @@ -5,7 +5,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,622 +15,40 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Netflix/go-env v0.0.0-20210215222557-e437a7e7f9fb h1:w9IDEB7P1VzNcBpOG7kMpFkZp2DkyJIUt0gDx5MBhRU= github.com/Netflix/go-env v0.0.0-20210215222557-e437a7e7f9fb/go.mod h1:9XMFaCeRyW7fC9XJOWQ+NdAv8VLG7ys7l3x4ozEGLUQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -639,18 +56,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -658,40 +63,19 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/garyburd/redigo v1.6.4 h1:LFu2R3+ZOPgSMWMOL+saa/zXRjw0ID2G8FepO53BGlg= github.com/garyburd/redigo v1.6.4/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw= -github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= -github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= +github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -701,10 +85,8 @@ github.com/go-http-utils/fresh v0.0.0-20161124030543-7231e26a4b27 h1:O6yi4xa9b2D github.com/go-http-utils/fresh v0.0.0-20161124030543-7231e26a4b27/go.mod h1:AYvN8omj7nKLmbcXS2dyABYU6JB1Lz1bHmkkq1kf4I4= github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a h1:v6zMvHuY9yue4+QkG/HQ/W67wvtQmWJ4SDo9aK/GIno= github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a/go.mod h1:I79BieaU4fxrw4LMXby6q5OS9XnoR9UIKLOzDFjUmuw= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-ldap/ldap/v3 v3.4.5 h1:ekEKmaDrpvR2yf5Nc/DClsGG9lAmdDixe44mLzlW5r8= -github.com/go-ldap/ldap/v3 v3.4.5/go.mod h1:bMGIq3AGbytbaMwf8wdv5Phdxz0FWHTIYMSzyrYgnQs= +github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= +github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -745,8 +127,6 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= @@ -772,17 +152,12 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -790,8 +165,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -805,18 +178,12 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -825,19 +192,10 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -845,44 +203,12 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= @@ -893,14 +219,9 @@ github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7Fsg github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -911,30 +232,18 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -942,13 +251,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -962,20 +266,13 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac h1:jWKYCNlX4J5s8M0nHYkh7Y7c9gRVDEb3mq51j5J0F5M= @@ -983,34 +280,23 @@ github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac/go.mod h1:hoL github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= @@ -1020,16 +306,13 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= @@ -1043,12 +326,7 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7Jul github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= @@ -1059,70 +337,41 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -goauthentik.io/api/v3 v3.2023081.1 h1:kXD9ZxOEjVxTK+qGeB0I13A5TzvO/PlAQqVQOCYevUM= -goauthentik.io/api/v3 v3.2023081.1/go.mod h1:sP1/Ak/vGw96xNgpyoObHgXfyAElcTN5CbbC+VdPQXk= +goauthentik.io/api/v3 v3.2023083.3 h1:nfHJ5/I/jZJ3o7BKnP5hZ8tYV4kkkWw/+5GkBCQ5UkE= +goauthentik.io/api/v3 v3.2023083.3/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab h1:628ME69lBm9C6JY2wXhAph/yjN3jezx1z7BIDLUwxjo= golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1133,8 +382,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1143,15 +390,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1178,75 +418,22 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1256,15 +443,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1285,7 +466,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1298,102 +478,39 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1410,7 +527,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1437,40 +553,12 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1487,51 +575,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1563,127 +606,12 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1696,36 +624,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1738,11 +636,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/boj/redistore.v1 v1.0.0-20160128113310-fc113767cd6b h1:U/Uqd1232+wrnHOvWNaxrNqn/kFnr4yu4blgPtQt0N8= @@ -1751,12 +644,10 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1773,44 +664,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= layeh.com/radius v0.0.0-20210819152912-ad72663a72ab h1:05KeMI4s7jEdIfHb7QCjUr5X2BRA0gjLZLZEmmjGNc4= layeh.com/radius v0.0.0-20210819152912-ad72663a72ab/go.mod h1:pFWM9De99EY9TPVyHIyA56QmoRViVck/x41WFkUlc9A= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/constants/constants.go b/internal/constants/constants.go index d2d1aec48..a32e8622f 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -29,4 +29,4 @@ func UserAgent() string { return fmt.Sprintf("authentik@%s", FullVersion()) } -const VERSION = "2023.8.1" +const VERSION = "2023.8.3" diff --git a/internal/gounicorn/gounicorn.go b/internal/gounicorn/gounicorn.go index 5cf65a733..b07a8c61a 100644 --- a/internal/gounicorn/gounicorn.go +++ b/internal/gounicorn/gounicorn.go @@ -1,7 +1,6 @@ package gounicorn import ( - "net/http" "os" "os/exec" "runtime" @@ -10,10 +9,10 @@ import ( log "github.com/sirupsen/logrus" "goauthentik.io/internal/config" - "goauthentik.io/internal/utils/web" ) type GoUnicorn struct { + Healthcheck func() bool HealthyCallback func() log *log.Entry @@ -23,9 +22,10 @@ type GoUnicorn struct { alive bool } -func New() *GoUnicorn { +func New(healthcheck func() bool) *GoUnicorn { logger := log.WithField("logger", "authentik.router.unicorn") g := &GoUnicorn{ + Healthcheck: healthcheck, log: logger, started: false, killed: false, @@ -41,7 +41,7 @@ func (g *GoUnicorn) initCmd() { args := []string{"-c", "./lifecycle/gunicorn.conf.py", "authentik.root.asgi:application"} if config.Get().Debug { command = "./manage.py" - args = []string{"runserver"} + args = []string{"dev_server"} } g.log.WithField("args", args).WithField("cmd", command).Debug("Starting gunicorn") g.p = exec.Command(command, args...) @@ -69,22 +69,11 @@ func (g *GoUnicorn) Start() error { func (g *GoUnicorn) healthcheck() { g.log.Debug("starting healthcheck") - h := &http.Client{ - Transport: web.NewUserAgentTransport("goauthentik.io/proxy/healthcheck", http.DefaultTransport), - } - check := func() bool { - res, err := h.Get("http://localhost:8000/-/health/live/") - if err == nil && res.StatusCode == 204 { - g.alive = true - return true - } - return false - } - // Default healthcheck is every 1 second on startup // once we've been healthy once, increase to 30 seconds for range time.Tick(time.Second) { - if check() { + if g.Healthcheck() { + g.alive = true g.log.Info("backend is alive, backing off with healthchecks") g.HealthyCallback() break @@ -92,7 +81,7 @@ func (g *GoUnicorn) healthcheck() { g.log.Debug("backend not alive yet") } for range time.Tick(30 * time.Second) { - check() + g.Healthcheck() } } diff --git a/internal/web/metrics.go b/internal/web/metrics.go index 0f22f59ab..0b8670b61 100644 --- a/internal/web/metrics.go +++ b/internal/web/metrics.go @@ -1,6 +1,7 @@ package web import ( + "fmt" "io" "net/http" @@ -26,7 +27,7 @@ var ( }, []string{"dest"}) ) -func RunMetricsServer() { +func (ws *WebServer) runMetricsServer() { m := mux.NewRouter() l := log.WithField("logger", "authentik.router.metrics") m.Use(sentry.SentryNoSampleMiddleware) @@ -38,13 +39,13 @@ func RunMetricsServer() { ).ServeHTTP(rw, r) // Get upstream metrics - re, err := http.NewRequest("GET", "http://localhost:8000/-/metrics/", nil) + re, err := http.NewRequest("GET", fmt.Sprintf("%s/-/metrics/", ws.ul.String()), nil) if err != nil { l.WithError(err).Warning("failed to get upstream metrics") return } re.SetBasicAuth("monitor", config.Get().SecretKey) - res, err := http.DefaultClient.Do(re) + res, err := ws.upstreamHttpClient().Do(re) if err != nil { l.WithError(err).Warning("failed to get upstream metrics") return diff --git a/internal/web/proxy.go b/internal/web/proxy.go index 13c2c76fe..b52d24c3b 100644 --- a/internal/web/proxy.go +++ b/internal/web/proxy.go @@ -2,10 +2,10 @@ package web import ( "encoding/json" + "errors" "fmt" "net/http" "net/http/httputil" - "net/url" "time" "github.com/prometheus/client_golang/prometheus" @@ -14,10 +14,9 @@ import ( func (ws *WebServer) configureProxy() { // Reverse proxy to the application server - u, _ := url.Parse("http://localhost:8000") director := func(req *http.Request) { - req.URL.Scheme = u.Scheme - req.URL.Host = u.Host + req.URL.Scheme = ws.ul.Scheme + req.URL.Host = ws.ul.Host if _, ok := req.Header["User-Agent"]; !ok { // explicitly disable User-Agent so it's not set to default value req.Header.Set("User-Agent", "") @@ -27,7 +26,10 @@ func (ws *WebServer) configureProxy() { } ws.log.WithField("url", req.URL.String()).WithField("headers", req.Header).Trace("tracing request to backend") } - rp := &httputil.ReverseProxy{Director: director} + rp := &httputil.ReverseProxy{ + Director: director, + Transport: ws.upstreamHttpClient().Transport, + } rp.ErrorHandler = ws.proxyErrorHandler rp.ModifyResponse = ws.proxyModifyResponse ws.m.PathPrefix("/outpost.goauthentik.io").HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { @@ -43,14 +45,14 @@ func (ws *WebServer) configureProxy() { }).Observe(float64(elapsed)) return } - ws.proxyErrorHandler(rw, r, fmt.Errorf("proxy not running")) + ws.proxyErrorHandler(rw, r, errors.New("proxy not running")) }) ws.m.Path("/-/health/live/").HandlerFunc(sentry.SentryNoSample(func(rw http.ResponseWriter, r *http.Request) { rw.WriteHeader(204) })) ws.m.PathPrefix("/").HandlerFunc(sentry.SentryNoSample(func(rw http.ResponseWriter, r *http.Request) { - if !ws.p.IsRunning() { - ws.proxyErrorHandler(rw, r, fmt.Errorf("authentik core not running yet")) + if !ws.g.IsRunning() { + ws.proxyErrorHandler(rw, r, errors.New("authentik starting")) return } before := time.Now() @@ -82,17 +84,14 @@ func (ws *WebServer) proxyErrorHandler(rw http.ResponseWriter, req *http.Request ws.log.WithError(err).Warning("failed to proxy to backend") rw.WriteHeader(http.StatusBadGateway) em := fmt.Sprintf("failed to connect to authentik backend: %v", err) - if !ws.p.IsRunning() { - em = "authentik starting..." - } // return json if the client asks for json if req.Header.Get("Accept") == "application/json" { - eem, _ := json.Marshal(map[string]string{ + err = json.NewEncoder(rw).Encode(map[string]string{ "error": em, }) - em = string(eem) + } else { + _, err = rw.Write([]byte(em)) } - _, err = rw.Write([]byte(em)) if err != nil { ws.log.WithError(err).Warning("failed to write error message") } diff --git a/internal/web/web.go b/internal/web/web.go index 97a1eb068..e0b3a749d 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -3,8 +3,12 @@ package web import ( "context" "errors" + "fmt" "net" "net/http" + "net/url" + "os" + "path" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -26,13 +30,18 @@ type WebServer struct { ProxyServer *proxyv2.ProxyServer TenantTLS *tenant_tls.Watcher + g *gounicorn.GoUnicorn + gr bool m *mux.Router lh *mux.Router log *log.Entry - p *gounicorn.GoUnicorn + uc *http.Client + ul *url.URL } -func NewWebServer(g *gounicorn.GoUnicorn) *WebServer { +const UnixSocketName = "authentik-core.sock" + +func NewWebServer() *WebServer { l := log.WithField("logger", "authentik.router") mainHandler := mux.NewRouter() mainHandler.Use(web.ProxyHeaders()) @@ -40,23 +49,80 @@ func NewWebServer(g *gounicorn.GoUnicorn) *WebServer { loggingHandler := mainHandler.NewRoute().Subrouter() loggingHandler.Use(web.NewLoggingHandler(l, nil)) + tmp := os.TempDir() + socketPath := path.Join(tmp, "authentik-core.sock") + + // create http client to talk to backend, normal client if we're in debug more + // and a client that connects to our socket when in non debug mode + var upstreamClient *http.Client + if config.Get().Debug { + upstreamClient = http.DefaultClient + } else { + upstreamClient = &http.Client{ + Transport: &http.Transport{ + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { + return net.Dial("unix", socketPath) + }, + }, + } + } + + u, _ := url.Parse("http://localhost:8000") + ws := &WebServer{ m: mainHandler, lh: loggingHandler, log: l, - p: g, + gr: true, + uc: upstreamClient, + ul: u, } ws.configureStatic() ws.configureProxy() + ws.g = gounicorn.New(func() bool { + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/-/health/live/", ws.ul.String()), nil) + if err != nil { + ws.log.WithError(err).Warning("failed to create request for healthcheck") + return false + } + req.Header.Set("User-Agent", "goauthentik.io/router/healthcheck") + res, err := ws.upstreamHttpClient().Do(req) + if err == nil && res.StatusCode == 204 { + return true + } + return false + }) return ws } func (ws *WebServer) Start() { + go ws.runMetricsServer() + go ws.attemptStartBackend() go ws.listenPlain() go ws.listenTLS() } +func (ws *WebServer) attemptStartBackend() { + for { + if !ws.gr { + return + } + err := ws.g.Start() + log.WithField("logger", "authentik.router").WithError(err).Warning("gunicorn process died, restarting") + } +} + +func (ws *WebServer) Core() *gounicorn.GoUnicorn { + return ws.g +} + +func (ws *WebServer) upstreamHttpClient() *http.Client { + return ws.uc +} + func (ws *WebServer) Shutdown() { + ws.log.Info("shutting down gunicorn") + ws.g.Kill() ws.stop <- struct{}{} } diff --git a/ldap.Dockerfile b/ldap.Dockerfile index 2bd4dc2c6..576a840ea 100644 --- a/ldap.Dockerfile +++ b/ldap.Dockerfile @@ -1,11 +1,19 @@ # Stage 1: Build -FROM docker.io/golang:1.21.0-bookworm AS builder +FROM docker.io/golang:1.21.1-bookworm AS builder WORKDIR /go/src/goauthentik.io -COPY . . +RUN --mount=type=bind,target=/go/src/goauthentik.io/go.mod,src=./go.mod \ + --mount=type=bind,target=/go/src/goauthentik.io/go.sum,src=./go.sum \ + --mount=type=bind,target=/go/src/goauthentik.io/gen-go-api,src=./gen-go-api \ + --mount=type=cache,target=/go/pkg/mod \ + go mod download + ENV CGO_ENABLED=0 -RUN go build -o /go/ldap ./cmd/ldap +COPY . . +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o /go/ldap ./cmd/ldap # Stage 2: Run FROM gcr.io/distroless/static-debian11:debug diff --git a/lifecycle/ak b/lifecycle/ak index 3b061cd52..2ea6a4f59 100755 --- a/lifecycle/ak +++ b/lifecycle/ak @@ -55,7 +55,7 @@ function cleanup { } function prepare_debug { - pip install --no-cache-dir -r /requirements-dev.txt + poetry install --no-ansi --no-interaction touch /unittest.xml chown authentik:authentik /unittest.xml } diff --git a/lifecycle/gunicorn.conf.py b/lifecycle/gunicorn.conf.py index 9359196fc..b26e23fb0 100644 --- a/lifecycle/gunicorn.conf.py +++ b/lifecycle/gunicorn.conf.py @@ -7,12 +7,12 @@ from pathlib import Path from tempfile import gettempdir from typing import TYPE_CHECKING -import structlog from kubernetes.config.incluster_config import SERVICE_HOST_ENV_NAME from prometheus_client.values import MultiProcessValue from authentik import get_full_version from authentik.lib.config import CONFIG +from authentik.lib.logging import get_logger_config from authentik.lib.utils.http import get_http_session from authentik.lib.utils.reflection import get_env from authentik.root.install_id import get_install_id_raw @@ -21,57 +21,23 @@ from lifecycle.worker import DjangoUvicornWorker if TYPE_CHECKING: from gunicorn.arbiter import Arbiter -bind = "127.0.0.1:8000" - _tmp = Path(gettempdir()) worker_class = "lifecycle.worker.DjangoUvicornWorker" worker_tmp_dir = str(_tmp.joinpath("authentik_worker_tmp")) prometheus_tmp_dir = str(_tmp.joinpath("authentik_prometheus_tmp")) -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "authentik.root.settings") -os.environ.setdefault("PROMETHEUS_MULTIPROC_DIR", prometheus_tmp_dir) - makedirs(worker_tmp_dir, exist_ok=True) makedirs(prometheus_tmp_dir, exist_ok=True) +bind = f"unix://{str(_tmp.joinpath('authentik-core.sock'))}" + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "authentik.root.settings") +os.environ.setdefault("PROMETHEUS_MULTIPROC_DIR", prometheus_tmp_dir) + max_requests = 1000 max_requests_jitter = 50 -_debug = CONFIG.get_bool("DEBUG", False) - -logconfig_dict = { - "version": 1, - "disable_existing_loggers": False, - "formatters": { - "json": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.processors.JSONRenderer(), - "foreign_pre_chain": [ - structlog.stdlib.add_log_level, - structlog.stdlib.add_logger_name, - structlog.processors.TimeStamper(), - structlog.processors.StackInfoRenderer(), - ], - }, - "console": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.dev.ConsoleRenderer(colors=True), - "foreign_pre_chain": [ - structlog.stdlib.add_log_level, - structlog.stdlib.add_logger_name, - structlog.processors.TimeStamper(), - structlog.processors.StackInfoRenderer(), - ], - }, - }, - "handlers": { - "console": {"class": "logging.StreamHandler", "formatter": "json" if _debug else "console"}, - }, - "loggers": { - "uvicorn": {"handlers": ["console"], "level": "WARNING", "propagate": False}, - "gunicorn": {"handlers": ["console"], "level": "INFO", "propagate": False}, - }, -} +logconfig_dict = get_logger_config() # if we're running in kubernetes, use fixed workers because we can scale with more pods # otherwise (assume docker-compose), use as much as we can diff --git a/lifecycle/system_migrations/otp_merge.py b/lifecycle/system_migrations/otp_merge.py new file mode 100644 index 000000000..c3908bffa --- /dev/null +++ b/lifecycle/system_migrations/otp_merge.py @@ -0,0 +1,47 @@ +# flake8: noqa +from os import system + +from lifecycle.migrate import BaseMigration + +SQL_STATEMENT = """ +BEGIN TRANSACTION; +DELETE FROM django_migrations WHERE app = 'otp_static'; +DELETE FROM django_migrations WHERE app = 'otp_totp'; +-- Rename tables (static) +ALTER TABLE otp_static_staticdevice RENAME TO authentik_stages_authenticator_static_staticdevice; +ALTER TABLE otp_static_statictoken RENAME TO authentik_stages_authenticator_static_statictoken; +ALTER SEQUENCE otp_static_statictoken_id_seq RENAME TO authentik_stages_authenticator_static_statictoken_id_seq; +ALTER SEQUENCE otp_static_staticdevice_id_seq RENAME TO authentik_stages_authenticator_static_staticdevice_id_seq; +-- Rename tables (totp) +ALTER TABLE otp_totp_totpdevice RENAME TO authentik_stages_authenticator_totp_totpdevice; +ALTER SEQUENCE otp_totp_totpdevice_id_seq RENAME TO authentik_stages_authenticator_totp_totpdevice_id_seq; +COMMIT;""" + + +class Migration(BaseMigration): + def needs_migration(self) -> bool: + self.cur.execute( + "select * from information_schema.tables WHERE table_name='otp_static_staticdevice'" + ) + return bool(self.cur.rowcount) + + def system_crit(self, command): + retval = system(command) # nosec + if retval != 0: + raise Exception("Migration error") + + def run(self): + self.cur.execute(SQL_STATEMENT) + self.con.commit() + self.system_crit( + "./manage.py migrate authentik_stages_authenticator_static 0008_initial --fake" + ) + self.system_crit( + "./manage.py migrate authentik_stages_authenticator_static 0009_throttling --fake" + ) + self.system_crit( + "./manage.py migrate authentik_stages_authenticator_totp 0008_initial --fake" + ) + self.system_crit( + "./manage.py migrate authentik_stages_authenticator_totp 0009_auto_20190420_0723 --fake" + ) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index cf9509f65..db2b66eb5 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-30 17:44+0000\n" +"POT-Creation-Date: 2023-09-15 09:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -220,29 +220,29 @@ msgstr "" msgid "Authenticated Sessions" msgstr "" -#: authentik/core/sources/flow_manager.py:193 +#: authentik/core/sources/flow_manager.py:189 #, python-format msgid "" "Request to authenticate with %(source)s has been denied. Please authenticate " "with the source you've previously signed up with." msgstr "" -#: authentik/core/sources/flow_manager.py:245 +#: authentik/core/sources/flow_manager.py:241 msgid "Configured flow does not exist." msgstr "" -#: authentik/core/sources/flow_manager.py:275 -#: authentik/core/sources/flow_manager.py:327 +#: authentik/core/sources/flow_manager.py:271 +#: authentik/core/sources/flow_manager.py:323 #, python-format msgid "Successfully authenticated with %(source)s!" msgstr "" -#: authentik/core/sources/flow_manager.py:299 +#: authentik/core/sources/flow_manager.py:295 #, python-format msgid "Successfully linked %(source)s!" msgstr "" -#: authentik/core/sources/flow_manager.py:318 +#: authentik/core/sources/flow_manager.py:314 msgid "Source is not configured for enrollment." msgstr "" @@ -325,6 +325,14 @@ msgstr "" msgid "Certificate-Key Pairs" msgstr "" +#: authentik/enterprise/models.py:193 +msgid "License Usage" +msgstr "" + +#: authentik/enterprise/models.py:194 +msgid "License Usage Records" +msgstr "" + #: authentik/events/models.py:290 msgid "Event" msgstr "" @@ -748,25 +756,29 @@ msgstr "" msgid "Timeout after which Policy execution is terminated." msgstr "" -#: authentik/policies/models.py:142 +#: authentik/policies/models.py:92 +msgid "Result if the Policy execution fails." +msgstr "" + +#: authentik/policies/models.py:145 msgid "Policy Binding" msgstr "" -#: authentik/policies/models.py:143 +#: authentik/policies/models.py:146 msgid "Policy Bindings" msgstr "" -#: authentik/policies/models.py:164 +#: authentik/policies/models.py:167 msgid "" "When this option is enabled, all executions of this policy will be logged. " "By default, only execution errors are logged." msgstr "" -#: authentik/policies/models.py:186 +#: authentik/policies/models.py:189 msgid "Policy" msgstr "" -#: authentik/policies/models.py:187 +#: authentik/policies/models.py:190 msgid "Policies" msgstr "" @@ -804,14 +816,26 @@ msgstr "" msgid "Password Policies" msgstr "" -#: authentik/policies/reputation/models.py:58 +#: authentik/policies/reputation/api.py:18 +msgid "Either IP or Username must be checked" +msgstr "" + +#: authentik/policies/reputation/models.py:67 msgid "Reputation Policy" msgstr "" -#: authentik/policies/reputation/models.py:59 +#: authentik/policies/reputation/models.py:68 msgid "Reputation Policies" msgstr "" +#: authentik/policies/reputation/models.py:95 +msgid "Reputation Score" +msgstr "" + +#: authentik/policies/reputation/models.py:96 +msgid "Reputation Scores" +msgstr "" + #: authentik/policies/templates/policies/denied.html:7 #: authentik/policies/templates/policies/denied.html:11 msgid "Permission denied" @@ -1242,11 +1266,11 @@ msgstr "" msgid "Radius Providers" msgstr "" -#: authentik/providers/saml/api/providers.py:260 +#: authentik/providers/saml/api/providers.py:257 msgid "Invalid XML Syntax" msgstr "" -#: authentik/providers/saml/api/providers.py:270 +#: authentik/providers/saml/api/providers.py:267 #, python-format msgid "Failed to import Metadata: %(message)s" msgstr "" @@ -1862,8 +1886,8 @@ msgid "SMS Devices" msgstr "" #: authentik/stages/authenticator_sms/stage.py:55 -#: authentik/stages/authenticator_totp/stage.py:42 -#: authentik/stages/authenticator_totp/stage.py:45 +#: authentik/stages/authenticator_totp/stage.py:41 +#: authentik/stages/authenticator_totp/stage.py:44 msgid "Code does not match" msgstr "" @@ -1871,30 +1895,46 @@ msgstr "" msgid "Invalid phone number" msgstr "" -#: authentik/stages/authenticator_static/models.py:47 +#: authentik/stages/authenticator_static/models.py:52 msgid "Static Authenticator Stage" msgstr "" -#: authentik/stages/authenticator_static/models.py:48 +#: authentik/stages/authenticator_static/models.py:53 msgid "Static Authenticator Stages" msgstr "" -#: authentik/stages/authenticator_totp/models.py:16 +#: authentik/stages/authenticator_static/models.py:98 +msgid "Static device" +msgstr "" + +#: authentik/stages/authenticator_static/models.py:99 +msgid "Static devices" +msgstr "" + +#: authentik/stages/authenticator_totp/models.py:25 msgid "6 digits, widely compatible" msgstr "" -#: authentik/stages/authenticator_totp/models.py:17 +#: authentik/stages/authenticator_totp/models.py:26 msgid "8 digits, not compatible with apps like Google Authenticator" msgstr "" -#: authentik/stages/authenticator_totp/models.py:53 +#: authentik/stages/authenticator_totp/models.py:62 msgid "TOTP Authenticator Setup Stage" msgstr "" -#: authentik/stages/authenticator_totp/models.py:54 +#: authentik/stages/authenticator_totp/models.py:63 msgid "TOTP Authenticator Setup Stages" msgstr "" +#: authentik/stages/authenticator_totp/models.py:244 +msgid "TOTP device" +msgstr "" + +#: authentik/stages/authenticator_totp/models.py:245 +msgid "TOTP devices" +msgstr "" + #: authentik/stages/authenticator_validate/challenge.py:131 msgid "Invalid Token" msgstr "" @@ -2221,7 +2261,7 @@ msgstr "" msgid "Invitations" msgstr "" -#: authentik/stages/invitation/stage.py:66 +#: authentik/stages/invitation/stage.py:62 msgid "Invalid invite/invite not found" msgstr "" @@ -2255,7 +2295,7 @@ msgstr "" msgid "Password Stages" msgstr "" -#: authentik/stages/password/stage.py:159 +#: authentik/stages/password/stage.py:124 msgid "Invalid password" msgstr "" @@ -2367,7 +2407,7 @@ msgstr "" msgid "User Delete Stages" msgstr "" -#: authentik/stages/user_delete/stage.py:22 +#: authentik/stages/user_delete/stage.py:18 msgid "No Pending User." msgstr "" @@ -2396,11 +2436,11 @@ msgstr "" msgid "User Login Stages" msgstr "" -#: authentik/stages/user_login/stage.py:63 +#: authentik/stages/user_login/stage.py:57 msgid "No Pending user to login." msgstr "" -#: authentik/stages/user_login/stage.py:96 +#: authentik/stages/user_login/stage.py:90 msgid "Successfully logged in!" msgstr "" @@ -2428,16 +2468,16 @@ msgstr "" msgid "User Write Stages" msgstr "" -#: authentik/stages/user_write/stage.py:134 +#: authentik/stages/user_write/stage.py:130 msgid "No Pending data." msgstr "" -#: authentik/stages/user_write/stage.py:140 +#: authentik/stages/user_write/stage.py:136 msgid "No user found and can't create new user." msgstr "" -#: authentik/stages/user_write/stage.py:157 -#: authentik/stages/user_write/stage.py:171 +#: authentik/stages/user_write/stage.py:153 +#: authentik/stages/user_write/stage.py:167 msgid "Failed to update user. Please try again later." msgstr "" diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index 005955a1a..44523d516 100644 Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ diff --git a/locale/nl/LC_MESSAGES/django.mo b/locale/nl/LC_MESSAGES/django.mo index 2e7e7fc26..67e966ad9 100644 Binary files a/locale/nl/LC_MESSAGES/django.mo and b/locale/nl/LC_MESSAGES/django.mo differ diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po index e68eef205..d4bdf371a 100644 --- a/locale/nl/LC_MESSAGES/django.po +++ b/locale/nl/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-23 10:04+0000\n" +"POT-Creation-Date: 2023-09-02 15:45+0000\n" "PO-Revision-Date: 2022-09-26 16:47+0000\n" "Last-Translator: ServusNL, 2023\n" "Language-Team: Dutch (https://app.transifex.com/authentik/teams/119923/nl/)\n" @@ -30,11 +30,11 @@ msgstr "" msgid "Successfully re-scheduled Task %(name)s!" msgstr "Taak %(name)s succesvol opnieuw ingepland!" -#: authentik/api/schema.py:24 +#: authentik/api/schema.py:25 msgid "Generic API Error" msgstr "Algemene API-fout" -#: authentik/api/schema.py:32 +#: authentik/api/schema.py:33 msgid "Validation Error" msgstr "Validatiefout" @@ -94,11 +94,11 @@ msgstr "SAML-provider uit metagegevens" msgid "Create a SAML Provider by importing its Metadata." msgstr "Maak een SAML-provider door de metagegevens te importeren." -#: authentik/core/api/users.py:150 +#: authentik/core/api/users.py:158 msgid "No leading or trailing slashes allowed." msgstr "Geen voor- of achtervoegsels toegestaan." -#: authentik/core/api/users.py:153 +#: authentik/core/api/users.py:161 msgid "No empty segments in user path allowed." msgstr "Geen lege segmenten in het gebruikerspad toegestaan." @@ -115,7 +115,7 @@ msgstr "" msgid "User's display name." msgstr "Weergavenaam van de gebruiker." -#: authentik/core/models.py:268 authentik/providers/oauth2/models.py:294 +#: authentik/core/models.py:268 authentik/providers/oauth2/models.py:295 msgid "User" msgstr "Gebruiker" @@ -328,12 +328,12 @@ msgstr "" msgid "Go home" msgstr "Ga naar startpagina" -#: authentik/core/templates/login/base_full.html:90 +#: authentik/core/templates/login/base_full.html:89 msgid "Powered by authentik" msgstr "Aangedreven door authentik" #: authentik/core/views/apps.py:53 -#: authentik/providers/oauth2/views/authorize.py:391 +#: authentik/providers/oauth2/views/authorize.py:393 #: authentik/providers/oauth2/views/device_init.py:70 #: authentik/providers/saml/views/sso.py:70 #, python-format @@ -364,6 +364,14 @@ msgstr "Certificaat-Sleutelpaar" msgid "Certificate-Key Pairs" msgstr "Certificaat-Sleutelparen" +#: authentik/enterprise/models.py:193 +msgid "License Usage" +msgstr "Licentie Gebruik" + +#: authentik/enterprise/models.py:194 +msgid "License Usage Records" +msgstr "Licentie Gebruik Records" + #: authentik/events/models.py:290 msgid "Event" msgstr "Gebeurtenis" @@ -899,14 +907,22 @@ msgstr "Wachtwoordbeleid" msgid "Password Policies" msgstr "Wachtwoordbeleiden" -#: authentik/policies/reputation/models.py:58 +#: authentik/policies/reputation/models.py:67 msgid "Reputation Policy" msgstr "Reputatiebeleid" -#: authentik/policies/reputation/models.py:59 +#: authentik/policies/reputation/models.py:68 msgid "Reputation Policies" msgstr "Reputatiebeleiden" +#: authentik/policies/reputation/models.py:95 +msgid "Reputation Score" +msgstr "Reputatie Score" + +#: authentik/policies/reputation/models.py:96 +msgid "Reputation Scores" +msgstr "Reputatie Scores" + #: authentik/policies/templates/policies/denied.html:7 #: authentik/policies/templates/policies/denied.html:11 msgid "Permission denied" @@ -1037,64 +1053,64 @@ msgstr "" "'upn'-attribuut heeft ingesteld. Gebruik deze methode alleen als u " "verschillende UPN- en Mail-domeinen heeft." -#: authentik/providers/oauth2/models.py:42 +#: authentik/providers/oauth2/models.py:43 msgid "Confidential" msgstr "Vertrouwelijk" -#: authentik/providers/oauth2/models.py:43 +#: authentik/providers/oauth2/models.py:44 msgid "Public" msgstr "Openbaar" -#: authentik/providers/oauth2/models.py:65 +#: authentik/providers/oauth2/models.py:66 msgid "Same identifier is used for all providers" msgstr "Hetzelfde identificatiemiddel wordt voor alle providers gebruikt" -#: authentik/providers/oauth2/models.py:67 +#: authentik/providers/oauth2/models.py:68 msgid "Each provider has a different issuer, based on the application slug." msgstr "" "Elke provider heeft een andere uitgever, gebaseerd op de toepassingsslug." -#: authentik/providers/oauth2/models.py:74 +#: authentik/providers/oauth2/models.py:75 msgid "code (Authorization Code Flow)" msgstr "code (Autorisatiecode-flow)" -#: authentik/providers/oauth2/models.py:75 +#: authentik/providers/oauth2/models.py:76 msgid "id_token (Implicit Flow)" msgstr "id_token (Impliciete Flow)" -#: authentik/providers/oauth2/models.py:76 +#: authentik/providers/oauth2/models.py:77 msgid "id_token token (Implicit Flow)" msgstr "id_token token (Impliciete Flow)" -#: authentik/providers/oauth2/models.py:77 +#: authentik/providers/oauth2/models.py:78 msgid "code token (Hybrid Flow)" msgstr "code token (Hybride Flow)" -#: authentik/providers/oauth2/models.py:78 +#: authentik/providers/oauth2/models.py:79 msgid "code id_token (Hybrid Flow)" msgstr "code id_token (Hybride Flow)" -#: authentik/providers/oauth2/models.py:79 +#: authentik/providers/oauth2/models.py:80 msgid "code id_token token (Hybrid Flow)" msgstr "code id_token token (Hybride Flow)" -#: authentik/providers/oauth2/models.py:85 +#: authentik/providers/oauth2/models.py:86 msgid "HS256 (Symmetric Encryption)" msgstr "HS256 (Symmetrische Versleuteling)" -#: authentik/providers/oauth2/models.py:86 +#: authentik/providers/oauth2/models.py:87 msgid "RS256 (Asymmetric Encryption)" msgstr "RS256 (Asymmetrische Versleuteling)" -#: authentik/providers/oauth2/models.py:87 +#: authentik/providers/oauth2/models.py:88 msgid "ES256 (Asymmetric Encryption)" msgstr "ES256 (Asymmetrische Versleuteling)" -#: authentik/providers/oauth2/models.py:93 +#: authentik/providers/oauth2/models.py:94 msgid "Scope used by the client" msgstr "Scope gebruikt door de cliënt" -#: authentik/providers/oauth2/models.py:97 +#: authentik/providers/oauth2/models.py:98 msgid "" "Description shown to the user when consenting. If left empty, the user won't" " be informed." @@ -1102,19 +1118,19 @@ msgstr "" "Beschrijving getoond aan de gebruiker bij toestemming. Als leeg gelaten, " "wordt de gebruiker niet geïnformeerd." -#: authentik/providers/oauth2/models.py:116 +#: authentik/providers/oauth2/models.py:117 msgid "Scope Mapping" msgstr "Scope-mapping" -#: authentik/providers/oauth2/models.py:117 +#: authentik/providers/oauth2/models.py:118 msgid "Scope Mappings" msgstr "Scope-mappings" -#: authentik/providers/oauth2/models.py:127 +#: authentik/providers/oauth2/models.py:128 msgid "Client Type" msgstr "Clienttype" -#: authentik/providers/oauth2/models.py:129 +#: authentik/providers/oauth2/models.py:130 msgid "" "Confidential clients are capable of maintaining the confidentiality of their" " credentials. Public clients are incapable" @@ -1122,27 +1138,27 @@ msgstr "" "Vertrouwelijke clients zijn in staat om de vertrouwelijkheid van hun " "referenties te behouden. Openbare clients zijn dat niet." -#: authentik/providers/oauth2/models.py:136 +#: authentik/providers/oauth2/models.py:137 msgid "Client ID" msgstr "Client-ID" -#: authentik/providers/oauth2/models.py:142 +#: authentik/providers/oauth2/models.py:143 msgid "Client Secret" msgstr "Client Geheim" -#: authentik/providers/oauth2/models.py:148 +#: authentik/providers/oauth2/models.py:149 msgid "Redirect URIs" msgstr "Omleidings-URI's" -#: authentik/providers/oauth2/models.py:149 +#: authentik/providers/oauth2/models.py:150 msgid "Enter each URI on a new line." msgstr "Voer elke URI op een nieuwe regel in." -#: authentik/providers/oauth2/models.py:154 +#: authentik/providers/oauth2/models.py:155 msgid "Include claims in id_token" msgstr "Inclusief claims in id_token" -#: authentik/providers/oauth2/models.py:156 +#: authentik/providers/oauth2/models.py:157 msgid "" "Include User claims from scopes in the id_token, for applications that don't" " access the userinfo endpoint." @@ -1150,7 +1166,7 @@ msgstr "" "Inclusief Gebruikersclaims uit scopes in id_token, voor toepassingen die " "geen toegang hebben tot het userinfo-eindpunt." -#: authentik/providers/oauth2/models.py:165 +#: authentik/providers/oauth2/models.py:166 msgid "" "Access codes not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." @@ -1158,8 +1174,8 @@ msgstr "" "Toegangscodes zijn niet geldig op of na de huidige tijd + deze waarde " "(Formaat: uren=1;minuten=2;seconden=3)." -#: authentik/providers/oauth2/models.py:173 -#: authentik/providers/oauth2/models.py:181 +#: authentik/providers/oauth2/models.py:174 +#: authentik/providers/oauth2/models.py:182 msgid "" "Tokens not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." @@ -1167,7 +1183,7 @@ msgstr "" "Tokens zijn niet geldig op of na de huidige tijd + deze waarde (Formaat: " "uren=1;minuten=2;seconden=3)." -#: authentik/providers/oauth2/models.py:190 +#: authentik/providers/oauth2/models.py:191 msgid "" "Configure what data should be used as unique User Identifier. For most " "cases, the default should be fine." @@ -1176,16 +1192,16 @@ msgstr "" "gebruikersidentificatie. In de meeste gevallen is de standaardinstelling " "prima." -#: authentik/providers/oauth2/models.py:197 +#: authentik/providers/oauth2/models.py:198 msgid "Configure how the issuer field of the ID Token should be filled." msgstr "" "Configureer hoe het uitgeversveld van het ID-token moet worden ingevuld." -#: authentik/providers/oauth2/models.py:202 +#: authentik/providers/oauth2/models.py:203 msgid "Signing Key" msgstr "Ondertekeningsleutel" -#: authentik/providers/oauth2/models.py:206 +#: authentik/providers/oauth2/models.py:207 msgid "" "Key used to sign the tokens. Only required when JWT Algorithm is set to " "RS256." @@ -1193,7 +1209,7 @@ msgstr "" "Sleutel gebruikt om de tokens te ondertekenen. Alleen vereist wanneer het " "JWT-algoritme is ingesteld op RS256." -#: authentik/providers/oauth2/models.py:213 +#: authentik/providers/oauth2/models.py:214 msgid "" "Any JWT signed by the JWK of the selected source can be used to " "authenticate." @@ -1201,72 +1217,72 @@ msgstr "" "Elke JWT ondertekend door de JWK van de geselecteerde bron kan worden " "gebruikt voor authenticatie." -#: authentik/providers/oauth2/models.py:286 +#: authentik/providers/oauth2/models.py:287 msgid "OAuth2/OpenID Provider" msgstr "OAuth2/OpenID-provider" -#: authentik/providers/oauth2/models.py:287 +#: authentik/providers/oauth2/models.py:288 msgid "OAuth2/OpenID Providers" msgstr "OAuth2/OpenID-providers" -#: authentik/providers/oauth2/models.py:296 -#: authentik/providers/oauth2/models.py:428 +#: authentik/providers/oauth2/models.py:297 +#: authentik/providers/oauth2/models.py:429 msgid "Scopes" msgstr "Scopes" -#: authentik/providers/oauth2/models.py:315 +#: authentik/providers/oauth2/models.py:316 msgid "Code" msgstr "Code" -#: authentik/providers/oauth2/models.py:316 +#: authentik/providers/oauth2/models.py:317 msgid "Nonce" msgstr "Nonce" -#: authentik/providers/oauth2/models.py:317 +#: authentik/providers/oauth2/models.py:318 msgid "Code Challenge" msgstr "Code-uitdaging" -#: authentik/providers/oauth2/models.py:319 +#: authentik/providers/oauth2/models.py:320 msgid "Code Challenge Method" msgstr "Code-uitdaging methode" -#: authentik/providers/oauth2/models.py:339 +#: authentik/providers/oauth2/models.py:340 msgid "Authorization Code" msgstr "Autorisatiecode" -#: authentik/providers/oauth2/models.py:340 +#: authentik/providers/oauth2/models.py:341 msgid "Authorization Codes" msgstr "Autorisatiecodes" -#: authentik/providers/oauth2/models.py:382 +#: authentik/providers/oauth2/models.py:383 msgid "OAuth2 Access Token" msgstr "OAuth2 Toegangstoken" -#: authentik/providers/oauth2/models.py:383 +#: authentik/providers/oauth2/models.py:384 msgid "OAuth2 Access Tokens" msgstr "OAuth2 Toegangstokens" -#: authentik/providers/oauth2/models.py:393 +#: authentik/providers/oauth2/models.py:394 msgid "ID Token" msgstr "ID-token" -#: authentik/providers/oauth2/models.py:412 +#: authentik/providers/oauth2/models.py:413 msgid "OAuth2 Refresh Token" msgstr "OAuth2 Verversingstoken" -#: authentik/providers/oauth2/models.py:413 +#: authentik/providers/oauth2/models.py:414 msgid "OAuth2 Refresh Tokens" msgstr "OAuth2 Verversingstokens" -#: authentik/providers/oauth2/models.py:440 +#: authentik/providers/oauth2/models.py:441 msgid "Device Token" msgstr "Apparaattoken" -#: authentik/providers/oauth2/models.py:441 +#: authentik/providers/oauth2/models.py:442 msgid "Device Tokens" msgstr "Apparaattokens" -#: authentik/providers/oauth2/views/authorize.py:446 +#: authentik/providers/oauth2/views/authorize.py:448 #: authentik/providers/saml/views/flows.py:87 #, python-format msgid "Redirecting to %(app)s..." @@ -1276,20 +1292,20 @@ msgstr "Doorverwijzen naar %(app)s..." msgid "Invalid code" msgstr "Ongeldige code" -#: authentik/providers/oauth2/views/userinfo.py:51 -#: authentik/providers/oauth2/views/userinfo.py:52 +#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:56 msgid "GitHub Compatibility: Access your User Information" msgstr "GitHub-compatibiliteit: Toegang tot uw Gebruikersinformatie" -#: authentik/providers/oauth2/views/userinfo.py:53 +#: authentik/providers/oauth2/views/userinfo.py:57 msgid "GitHub Compatibility: Access you Email addresses" msgstr "GitHub-compatibiliteit: Toegang tot uw E-mailadressen" -#: authentik/providers/oauth2/views/userinfo.py:54 +#: authentik/providers/oauth2/views/userinfo.py:58 msgid "GitHub Compatibility: Access your Groups" msgstr "GitHub-compatibiliteit: Toegang tot uw Groepen" -#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:59 msgid "authentik API Access on behalf of your user" msgstr "authentik API-toegang namens uw gebruiker" @@ -1299,7 +1315,7 @@ msgstr "" "Gebruikers- en wachtwoordeigenschappen moeten worden ingesteld wanneer " "basisverificatie is ingeschakeld." -#: authentik/providers/proxy/api.py:62 +#: authentik/providers/proxy/api.py:63 msgid "Internal host cannot be empty when forward auth is disabled." msgstr "" "Interne host kan niet leeg zijn wanneer doorsturen van verificatie is " @@ -1403,11 +1419,11 @@ msgstr "Radius-provider" msgid "Radius Providers" msgstr "Radius-providers" -#: authentik/providers/saml/api/providers.py:260 +#: authentik/providers/saml/api/providers.py:257 msgid "Invalid XML Syntax" msgstr "Ongeldige XML-syntaxis" -#: authentik/providers/saml/api/providers.py:270 +#: authentik/providers/saml/api/providers.py:267 #, python-format msgid "Failed to import Metadata: %(message)s" msgstr "Mislukt om Metadata te importeren: %(message)s" @@ -2109,7 +2125,7 @@ msgstr "TOTP Authenticator Installatiestadium" msgid "TOTP Authenticator Setup Stages" msgstr "TOTP Authenticator Installatiestadia" -#: authentik/stages/authenticator_validate/challenge.py:123 +#: authentik/stages/authenticator_validate/challenge.py:131 msgid "Invalid Token" msgstr "Ongeldig token" @@ -2269,15 +2285,15 @@ msgstr "E-mailstadium" msgid "Email Stages" msgstr "E-mailstadia" -#: authentik/stages/email/stage.py:112 +#: authentik/stages/email/stage.py:117 msgid "Successfully verified Email." msgstr "E-mail succesvol geverifieerd." -#: authentik/stages/email/stage.py:119 authentik/stages/email/stage.py:141 +#: authentik/stages/email/stage.py:124 authentik/stages/email/stage.py:146 msgid "No pending user." msgstr "Geen wachtende gebruiker." -#: authentik/stages/email/stage.py:131 +#: authentik/stages/email/stage.py:136 msgid "Email sent." msgstr "E-mail verzonden." @@ -2418,11 +2434,11 @@ msgstr "Identificatiestadium" msgid "Identification Stages" msgstr "Identificatiestadia" -#: authentik/stages/identification/stage.py:184 +#: authentik/stages/identification/stage.py:188 msgid "Log in" msgstr "Inloggen" -#: authentik/stages/identification/stage.py:185 +#: authentik/stages/identification/stage.py:189 msgid "Continue" msgstr "Doorgaan" diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index c73b88627..1ae64f01f 100644 Binary files a/locale/tr/LC_MESSAGES/django.mo and b/locale/tr/LC_MESSAGES/django.mo differ diff --git a/locale/zh-Hans/LC_MESSAGES/django.po b/locale/zh-Hans/LC_MESSAGES/django.po index 3f550012e..5566dc1bf 100644 --- a/locale/zh-Hans/LC_MESSAGES/django.po +++ b/locale/zh-Hans/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-19 17:34+0000\n" +"POT-Creation-Date: 2023-09-15 09:51+0000\n" "PO-Revision-Date: 2022-09-26 16:47+0000\n" "Last-Translator: deluxghost, 2023\n" "Language-Team: Chinese Simplified (https://app.transifex.com/authentik/teams/119923/zh-Hans/)\n" @@ -29,11 +29,11 @@ msgstr "" msgid "Successfully re-scheduled Task %(name)s!" msgstr "已成功重新安排任务 %(name)s!" -#: authentik/api/schema.py:21 +#: authentik/api/schema.py:25 msgid "Generic API Error" msgstr "通用 API 错误" -#: authentik/api/schema.py:29 +#: authentik/api/schema.py:33 msgid "Validation Error" msgstr "校验错误" @@ -64,11 +64,11 @@ msgstr "" "由 authentik 管理的对象。这些对象会自动创建和更新。此标记仅仅表明对象可以被 Migration 覆盖。您仍然可以通过 API " "修改对象,但这些修改可能会在之后的更新中被覆盖。" -#: authentik/blueprints/models.py:109 +#: authentik/blueprints/models.py:112 msgid "Blueprint Instance" msgstr "蓝图实例" -#: authentik/blueprints/models.py:110 +#: authentik/blueprints/models.py:113 msgid "Blueprint Instances" msgstr "蓝图实例" @@ -90,167 +90,167 @@ msgstr "来自元数据的 SAML 提供程序" msgid "Create a SAML Provider by importing its Metadata." msgstr "通过导入元数据来创建 SAML 提供程序。" -#: authentik/core/api/users.py:143 +#: authentik/core/api/users.py:158 msgid "No leading or trailing slashes allowed." msgstr "不允许前缀或后缀斜线。" -#: authentik/core/api/users.py:146 +#: authentik/core/api/users.py:161 msgid "No empty segments in user path allowed." msgstr "不允许用户路径包含空段。" -#: authentik/core/models.py:74 +#: authentik/core/models.py:86 msgid "name" msgstr "名称" -#: authentik/core/models.py:76 +#: authentik/core/models.py:88 msgid "Users added to this group will be superusers." msgstr "添加到该组的用户均为超级用户。" -#: authentik/core/models.py:150 +#: authentik/core/models.py:142 msgid "User's display name." msgstr "用户的显示名称。" -#: authentik/core/models.py:243 authentik/providers/oauth2/models.py:294 +#: authentik/core/models.py:268 authentik/providers/oauth2/models.py:295 msgid "User" msgstr "用户" -#: authentik/core/models.py:244 +#: authentik/core/models.py:269 msgid "Users" msgstr "用户" -#: authentik/core/models.py:257 +#: authentik/core/models.py:282 msgid "" "Flow used for authentication when the associated application is accessed by " "an un-authenticated user." msgstr "当关联应用程序被未验证身份的用户访问时,用于身份验证的流程。" -#: authentik/core/models.py:267 +#: authentik/core/models.py:292 msgid "Flow used when authorizing this provider." msgstr "授权此提供程序时使用的流程。" -#: authentik/core/models.py:279 +#: authentik/core/models.py:304 msgid "" "Accessed from applications; optional backchannel providers for protocols " "like LDAP and SCIM." msgstr "从应用程序访问;为类似 LDAP 和 SCIM 的协议提供的可选反向通道提供程序。" -#: authentik/core/models.py:334 +#: authentik/core/models.py:359 msgid "Application's display Name." msgstr "应用的显示名称。" -#: authentik/core/models.py:335 +#: authentik/core/models.py:360 msgid "Internal application name, used in URLs." msgstr "应用的内部名称,在 URL 中使用。" -#: authentik/core/models.py:347 +#: authentik/core/models.py:372 msgid "Open launch URL in a new browser tab or window." msgstr "在新浏览器标签页或窗口中打开启动 URL。" -#: authentik/core/models.py:411 +#: authentik/core/models.py:436 msgid "Application" msgstr "应用程序" -#: authentik/core/models.py:412 +#: authentik/core/models.py:437 msgid "Applications" msgstr "应用程序" -#: authentik/core/models.py:418 +#: authentik/core/models.py:443 msgid "Use the source-specific identifier" msgstr "使用源特定的标识符" -#: authentik/core/models.py:420 +#: authentik/core/models.py:445 msgid "" "Link to a user with identical email address. Can have security implications " "when a source doesn't validate email addresses." msgstr "链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患。" -#: authentik/core/models.py:424 +#: authentik/core/models.py:449 msgid "" "Use the user's email address, but deny enrollment when the email address " "already exists." msgstr "使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册。" -#: authentik/core/models.py:427 +#: authentik/core/models.py:452 msgid "" "Link to a user with identical username. Can have security implications when " "a username is used with another source." msgstr "链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患。" -#: authentik/core/models.py:431 +#: authentik/core/models.py:456 msgid "" "Use the user's username, but deny enrollment when the username already " "exists." msgstr "使用用户的用户名,但在用户名已存在时拒绝注册。" -#: authentik/core/models.py:438 +#: authentik/core/models.py:463 msgid "Source's display Name." msgstr "源的显示名称。" -#: authentik/core/models.py:439 +#: authentik/core/models.py:464 msgid "Internal source name, used in URLs." msgstr "源的内部名称,在 URL 中使用。" -#: authentik/core/models.py:458 +#: authentik/core/models.py:483 msgid "Flow to use when authenticating existing users." msgstr "认证已存在用户时所使用的流程。" -#: authentik/core/models.py:467 +#: authentik/core/models.py:492 msgid "Flow to use when enrolling new users." msgstr "新用户注册的流程。" -#: authentik/core/models.py:475 +#: authentik/core/models.py:500 msgid "" "How the source determines if an existing user should be authenticated or a " "new user enrolled." msgstr "源怎样确定应该验证已有用户的身份还是注册新用户。" -#: authentik/core/models.py:647 +#: authentik/core/models.py:672 msgid "Token" msgstr "令牌" -#: authentik/core/models.py:648 +#: authentik/core/models.py:673 msgid "Tokens" msgstr "令牌" -#: authentik/core/models.py:689 +#: authentik/core/models.py:714 msgid "Property Mapping" msgstr "属性映射" -#: authentik/core/models.py:690 +#: authentik/core/models.py:715 msgid "Property Mappings" msgstr "属性映射" -#: authentik/core/models.py:725 +#: authentik/core/models.py:750 msgid "Authenticated Session" msgstr "已认证会话" -#: authentik/core/models.py:726 +#: authentik/core/models.py:751 msgid "Authenticated Sessions" msgstr "已认证会话" -#: authentik/core/sources/flow_manager.py:193 +#: authentik/core/sources/flow_manager.py:189 #, python-format msgid "" "Request to authenticate with %(source)s has been denied. Please authenticate" " with the source you've previously signed up with." msgstr "来自 %(source)s 的身份验证请求被拒绝。请用您注册时使用的方式验证身份。" -#: authentik/core/sources/flow_manager.py:245 +#: authentik/core/sources/flow_manager.py:241 msgid "Configured flow does not exist." msgstr "配置的流程不存在。" -#: authentik/core/sources/flow_manager.py:275 -#: authentik/core/sources/flow_manager.py:327 +#: authentik/core/sources/flow_manager.py:271 +#: authentik/core/sources/flow_manager.py:323 #, python-format msgid "Successfully authenticated with %(source)s!" msgstr "成功通过 %(source)s 认证!" -#: authentik/core/sources/flow_manager.py:299 +#: authentik/core/sources/flow_manager.py:295 #, python-format msgid "Successfully linked %(source)s!" msgstr "成功链接 %(source)s!" -#: authentik/core/sources/flow_manager.py:318 +#: authentik/core/sources/flow_manager.py:314 msgid "Source is not configured for enrollment." msgstr "源未被配置用于注册。" @@ -307,12 +307,12 @@ msgstr "" msgid "Go home" msgstr "前往首页" -#: authentik/core/templates/login/base_full.html:90 +#: authentik/core/templates/login/base_full.html:89 msgid "Powered by authentik" msgstr "由 authentik 强力驱动" #: authentik/core/views/apps.py:53 -#: authentik/providers/oauth2/views/authorize.py:386 +#: authentik/providers/oauth2/views/authorize.py:393 #: authentik/providers/oauth2/views/device_init.py:70 #: authentik/providers/saml/views/sso.py:70 #, python-format @@ -341,6 +341,14 @@ msgstr "证书密钥对" msgid "Certificate-Key Pairs" msgstr "证书密钥对" +#: authentik/enterprise/models.py:193 +msgid "License Usage" +msgstr "许可证使用情况" + +#: authentik/enterprise/models.py:194 +msgid "License Usage Records" +msgstr "许可证使用情况记录" + #: authentik/events/models.py:290 msgid "Event" msgstr "事件" @@ -443,7 +451,7 @@ msgstr "Webhook 映射" msgid "Webhook Mappings" msgstr "Webhook 映射" -#: authentik/events/monitored_tasks.py:195 +#: authentik/events/monitored_tasks.py:205 msgid "Task has not been run yet." msgstr "任务尚未运行。" @@ -452,55 +460,55 @@ msgstr "任务尚未运行。" msgid "Flow not applicable to current user/request: %(messages)s" msgstr "流程不适用于当前用户/请求:%(messages)s" -#: authentik/flows/api/flows_diagram.py:67 -#: authentik/flows/api/flows_diagram.py:93 +#: authentik/flows/api/flows_diagram.py:68 +#: authentik/flows/api/flows_diagram.py:94 #, python-format msgid "Policy (%(type)s)" msgstr "策略(%(type)s)" -#: authentik/flows/api/flows_diagram.py:70 +#: authentik/flows/api/flows_diagram.py:71 #, python-format msgid "Binding %(order)d" msgstr "绑定 %(order)d" -#: authentik/flows/api/flows_diagram.py:117 +#: authentik/flows/api/flows_diagram.py:118 msgid "Policy passed" msgstr "策略通过" -#: authentik/flows/api/flows_diagram.py:121 +#: authentik/flows/api/flows_diagram.py:122 #, python-format msgid "Stage (%(type)s)" msgstr "阶段(%(type)s)" -#: authentik/flows/api/flows_diagram.py:145 -#: authentik/flows/api/flows_diagram.py:205 +#: authentik/flows/api/flows_diagram.py:146 +#: authentik/flows/api/flows_diagram.py:206 msgid "Policy denied" msgstr "策略拒绝" -#: authentik/flows/api/flows_diagram.py:155 -#: authentik/flows/api/flows_diagram.py:167 -#: authentik/flows/api/flows_diagram.py:204 -#: authentik/flows/api/flows_diagram.py:226 +#: authentik/flows/api/flows_diagram.py:156 +#: authentik/flows/api/flows_diagram.py:168 +#: authentik/flows/api/flows_diagram.py:205 +#: authentik/flows/api/flows_diagram.py:227 msgid "End of the flow" msgstr "流程结束" -#: authentik/flows/api/flows_diagram.py:168 +#: authentik/flows/api/flows_diagram.py:169 msgid "Requirement not fulfilled" msgstr "需求条件未达成" -#: authentik/flows/api/flows_diagram.py:176 +#: authentik/flows/api/flows_diagram.py:177 msgid "Flow authentication requirement" msgstr "流程身份验证需求" -#: authentik/flows/api/flows_diagram.py:182 +#: authentik/flows/api/flows_diagram.py:183 msgid "Requirement fulfilled" msgstr "需求条件已达成" -#: authentik/flows/api/flows_diagram.py:195 +#: authentik/flows/api/flows_diagram.py:196 msgid "Pre-flow policies" msgstr "流程前置策略" -#: authentik/flows/api/flows_diagram.py:213 authentik/flows/models.py:193 +#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:193 msgid "Flow" msgstr "流程" @@ -682,14 +690,14 @@ msgid "Dummy Policies" msgstr "虚拟策略" #: authentik/policies/event_matcher/api.py:20 -#: authentik/policies/event_matcher/models.py:55 +#: authentik/policies/event_matcher/models.py:56 msgid "" "Match events created by selected application. When left empty, all " "applications are matched." msgstr "匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。" #: authentik/policies/event_matcher/api.py:29 -#: authentik/policies/event_matcher/models.py:63 +#: authentik/policies/event_matcher/models.py:64 msgid "" "Match events created by selected model. When left empty, all models are " "matched. When an app is selected, all the application's models are matched." @@ -699,23 +707,23 @@ msgstr "匹配选定模型创建的事件。如果留空,则匹配所有模型 msgid "At least one criteria must be set." msgstr "必须至少设置一项标准。" -#: authentik/policies/event_matcher/models.py:47 +#: authentik/policies/event_matcher/models.py:48 msgid "" "Match created events with this action type. When left empty, all action " "types will be matched." msgstr "将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。" -#: authentik/policies/event_matcher/models.py:71 +#: authentik/policies/event_matcher/models.py:73 msgid "" "Matches Event's Client IP (strict matching, for network matching use an " "Expression Policy)" msgstr "匹配事件的客户端 IP(严格匹配,要匹配网段请使用表达式策略)" -#: authentik/policies/event_matcher/models.py:141 +#: authentik/policies/event_matcher/models.py:143 msgid "Event Matcher Policy" msgstr "事件匹配策略" -#: authentik/policies/event_matcher/models.py:142 +#: authentik/policies/event_matcher/models.py:144 msgid "Event Matcher Policies" msgstr "事件匹配策略" @@ -768,25 +776,29 @@ msgstr "反转策略的结果。消息不受影响。" msgid "Timeout after which Policy execution is terminated." msgstr "策略执行终止的超时时间。" -#: authentik/policies/models.py:142 +#: authentik/policies/models.py:92 +msgid "Result if the Policy execution fails." +msgstr "策略执行失败时的结果。" + +#: authentik/policies/models.py:145 msgid "Policy Binding" msgstr "策略绑定" -#: authentik/policies/models.py:143 +#: authentik/policies/models.py:146 msgid "Policy Bindings" msgstr "策略绑定" -#: authentik/policies/models.py:164 +#: authentik/policies/models.py:167 msgid "" "When this option is enabled, all executions of this policy will be logged. " "By default, only execution errors are logged." msgstr "启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。" -#: authentik/policies/models.py:186 +#: authentik/policies/models.py:189 msgid "Policy" msgstr "策略" -#: authentik/policies/models.py:187 +#: authentik/policies/models.py:190 msgid "Policies" msgstr "策略" @@ -824,14 +836,26 @@ msgstr "密码策略" msgid "Password Policies" msgstr "密码策略" -#: authentik/policies/reputation/models.py:58 +#: authentik/policies/reputation/api.py:18 +msgid "Either IP or Username must be checked" +msgstr "必须检查 IP 或用户名" + +#: authentik/policies/reputation/models.py:67 msgid "Reputation Policy" msgstr "信誉策略" -#: authentik/policies/reputation/models.py:59 +#: authentik/policies/reputation/models.py:68 msgid "Reputation Policies" msgstr "信誉策略" +#: authentik/policies/reputation/models.py:95 +msgid "Reputation Score" +msgstr "信誉分数" + +#: authentik/policies/reputation/models.py:96 +msgid "Reputation Scores" +msgstr "信誉分数" + #: authentik/policies/templates/policies/denied.html:7 #: authentik/policies/templates/policies/denied.html:11 msgid "Permission denied" @@ -946,217 +970,217 @@ msgid "" "this method only if you have different UPN and Mail domains." msgstr "基于用户的 UPN,仅当用户设置了 'upn' 属性时才有效。仅当您有不同的 UPN 和 Mail 域时才使用此方法。" -#: authentik/providers/oauth2/models.py:42 +#: authentik/providers/oauth2/models.py:43 msgid "Confidential" msgstr "机密" -#: authentik/providers/oauth2/models.py:43 +#: authentik/providers/oauth2/models.py:44 msgid "Public" msgstr "公开" -#: authentik/providers/oauth2/models.py:65 +#: authentik/providers/oauth2/models.py:66 msgid "Same identifier is used for all providers" msgstr "所有提供程序都使用相同的标识符" -#: authentik/providers/oauth2/models.py:67 +#: authentik/providers/oauth2/models.py:68 msgid "Each provider has a different issuer, based on the application slug." msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。" -#: authentik/providers/oauth2/models.py:74 +#: authentik/providers/oauth2/models.py:75 msgid "code (Authorization Code Flow)" msgstr "code(授权码流程)" -#: authentik/providers/oauth2/models.py:75 +#: authentik/providers/oauth2/models.py:76 msgid "id_token (Implicit Flow)" msgstr "id_token(隐式流程)" -#: authentik/providers/oauth2/models.py:76 +#: authentik/providers/oauth2/models.py:77 msgid "id_token token (Implicit Flow)" msgstr "id_token token(隐式流程)" -#: authentik/providers/oauth2/models.py:77 +#: authentik/providers/oauth2/models.py:78 msgid "code token (Hybrid Flow)" msgstr "code token(混合流程)" -#: authentik/providers/oauth2/models.py:78 +#: authentik/providers/oauth2/models.py:79 msgid "code id_token (Hybrid Flow)" msgstr "code id_token(混合流程)" -#: authentik/providers/oauth2/models.py:79 +#: authentik/providers/oauth2/models.py:80 msgid "code id_token token (Hybrid Flow)" msgstr "code id_token token(混合流程)" -#: authentik/providers/oauth2/models.py:85 +#: authentik/providers/oauth2/models.py:86 msgid "HS256 (Symmetric Encryption)" msgstr "HS256(对称加密)" -#: authentik/providers/oauth2/models.py:86 +#: authentik/providers/oauth2/models.py:87 msgid "RS256 (Asymmetric Encryption)" msgstr "RS256(非对称加密)" -#: authentik/providers/oauth2/models.py:87 +#: authentik/providers/oauth2/models.py:88 msgid "ES256 (Asymmetric Encryption)" msgstr "ES256(非对称加密)" -#: authentik/providers/oauth2/models.py:93 +#: authentik/providers/oauth2/models.py:94 msgid "Scope used by the client" msgstr "客户端使用的作用域" -#: authentik/providers/oauth2/models.py:97 +#: authentik/providers/oauth2/models.py:98 msgid "" "Description shown to the user when consenting. If left empty, the user won't" " be informed." msgstr "同意授权时向用户显示的描述。如果留空,则不会告知用户。" -#: authentik/providers/oauth2/models.py:116 +#: authentik/providers/oauth2/models.py:117 msgid "Scope Mapping" msgstr "作用域映射" -#: authentik/providers/oauth2/models.py:117 +#: authentik/providers/oauth2/models.py:118 msgid "Scope Mappings" msgstr "作用域映射" -#: authentik/providers/oauth2/models.py:127 +#: authentik/providers/oauth2/models.py:128 msgid "Client Type" msgstr "客户端类型" -#: authentik/providers/oauth2/models.py:129 +#: authentik/providers/oauth2/models.py:130 msgid "" "Confidential clients are capable of maintaining the confidentiality of their" " credentials. Public clients are incapable" msgstr "机密客户端有能力维护其凭据的机密性。公开客户端无此能力。" -#: authentik/providers/oauth2/models.py:136 +#: authentik/providers/oauth2/models.py:137 msgid "Client ID" msgstr "客户端 ID" -#: authentik/providers/oauth2/models.py:142 +#: authentik/providers/oauth2/models.py:143 msgid "Client Secret" msgstr "客户端密钥" -#: authentik/providers/oauth2/models.py:148 +#: authentik/providers/oauth2/models.py:149 msgid "Redirect URIs" msgstr "重定向 URI" -#: authentik/providers/oauth2/models.py:149 +#: authentik/providers/oauth2/models.py:150 msgid "Enter each URI on a new line." msgstr "每行输入一个 URI。" -#: authentik/providers/oauth2/models.py:154 +#: authentik/providers/oauth2/models.py:155 msgid "Include claims in id_token" msgstr "在 id_token 中包含声明" -#: authentik/providers/oauth2/models.py:156 +#: authentik/providers/oauth2/models.py:157 msgid "" "Include User claims from scopes in the id_token, for applications that don't" " access the userinfo endpoint." msgstr "对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。" -#: authentik/providers/oauth2/models.py:165 +#: authentik/providers/oauth2/models.py:166 msgid "" "Access codes not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." msgstr "从当前时间经过多久时或之后,访问代码无效(格式:hours=1;minutes=2;seconds=3)。" -#: authentik/providers/oauth2/models.py:173 -#: authentik/providers/oauth2/models.py:181 +#: authentik/providers/oauth2/models.py:174 +#: authentik/providers/oauth2/models.py:182 msgid "" "Tokens not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." msgstr "从当前时间经过多久时或之后,令牌无效(格式:hours=1;minutes=2;seconds=3)。" -#: authentik/providers/oauth2/models.py:190 +#: authentik/providers/oauth2/models.py:191 msgid "" "Configure what data should be used as unique User Identifier. For most " "cases, the default should be fine." msgstr "配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。" -#: authentik/providers/oauth2/models.py:197 +#: authentik/providers/oauth2/models.py:198 msgid "Configure how the issuer field of the ID Token should be filled." msgstr "配置如何填写 ID 令牌的颁发者字段。" -#: authentik/providers/oauth2/models.py:202 +#: authentik/providers/oauth2/models.py:203 msgid "Signing Key" msgstr "签名密钥" -#: authentik/providers/oauth2/models.py:206 +#: authentik/providers/oauth2/models.py:207 msgid "" "Key used to sign the tokens. Only required when JWT Algorithm is set to " "RS256." msgstr "用于签名令牌的密钥。仅当 JWT 算法设置为 RS256 时才需要。" -#: authentik/providers/oauth2/models.py:213 +#: authentik/providers/oauth2/models.py:214 msgid "" "Any JWT signed by the JWK of the selected source can be used to " "authenticate." msgstr "任何由选定来源的 JWK 签发的 JWT 都可以用于身份验证。" -#: authentik/providers/oauth2/models.py:286 +#: authentik/providers/oauth2/models.py:287 msgid "OAuth2/OpenID Provider" msgstr "OAuth2/OpenID 提供程序" -#: authentik/providers/oauth2/models.py:287 +#: authentik/providers/oauth2/models.py:288 msgid "OAuth2/OpenID Providers" msgstr "OAuth2/OpenID 提供程序" -#: authentik/providers/oauth2/models.py:296 -#: authentik/providers/oauth2/models.py:428 +#: authentik/providers/oauth2/models.py:297 +#: authentik/providers/oauth2/models.py:429 msgid "Scopes" msgstr "作用域" -#: authentik/providers/oauth2/models.py:315 +#: authentik/providers/oauth2/models.py:316 msgid "Code" msgstr "代码" -#: authentik/providers/oauth2/models.py:316 +#: authentik/providers/oauth2/models.py:317 msgid "Nonce" msgstr "Nonce" -#: authentik/providers/oauth2/models.py:317 +#: authentik/providers/oauth2/models.py:318 msgid "Code Challenge" msgstr "代码质询" -#: authentik/providers/oauth2/models.py:319 +#: authentik/providers/oauth2/models.py:320 msgid "Code Challenge Method" msgstr "代码质询方法" -#: authentik/providers/oauth2/models.py:339 +#: authentik/providers/oauth2/models.py:340 msgid "Authorization Code" msgstr "授权代码" -#: authentik/providers/oauth2/models.py:340 +#: authentik/providers/oauth2/models.py:341 msgid "Authorization Codes" msgstr "授权代码" -#: authentik/providers/oauth2/models.py:382 +#: authentik/providers/oauth2/models.py:383 msgid "OAuth2 Access Token" msgstr "OAuth2 访问令牌" -#: authentik/providers/oauth2/models.py:383 +#: authentik/providers/oauth2/models.py:384 msgid "OAuth2 Access Tokens" msgstr "OAuth2 访问令牌" -#: authentik/providers/oauth2/models.py:393 +#: authentik/providers/oauth2/models.py:394 msgid "ID Token" msgstr "ID 令牌" -#: authentik/providers/oauth2/models.py:412 +#: authentik/providers/oauth2/models.py:413 msgid "OAuth2 Refresh Token" msgstr "OAuth2 刷新令牌" -#: authentik/providers/oauth2/models.py:413 +#: authentik/providers/oauth2/models.py:414 msgid "OAuth2 Refresh Tokens" msgstr "OAuth2 刷新令牌" -#: authentik/providers/oauth2/models.py:440 +#: authentik/providers/oauth2/models.py:441 msgid "Device Token" msgstr "设备令牌" -#: authentik/providers/oauth2/models.py:441 +#: authentik/providers/oauth2/models.py:442 msgid "Device Tokens" msgstr "设备令牌" -#: authentik/providers/oauth2/views/authorize.py:441 +#: authentik/providers/oauth2/views/authorize.py:448 #: authentik/providers/saml/views/flows.py:87 #, python-format msgid "Redirecting to %(app)s..." @@ -1166,20 +1190,20 @@ msgstr "正在跳转到 %(app)s…" msgid "Invalid code" msgstr "无效代码" -#: authentik/providers/oauth2/views/userinfo.py:51 -#: authentik/providers/oauth2/views/userinfo.py:52 +#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:56 msgid "GitHub Compatibility: Access your User Information" msgstr "GitHub 兼容性:访问您的用户信息" -#: authentik/providers/oauth2/views/userinfo.py:53 +#: authentik/providers/oauth2/views/userinfo.py:57 msgid "GitHub Compatibility: Access you Email addresses" msgstr "GitHub 兼容性:访问您的电子邮件地址" -#: authentik/providers/oauth2/views/userinfo.py:54 +#: authentik/providers/oauth2/views/userinfo.py:58 msgid "GitHub Compatibility: Access your Groups" msgstr "GitHub 兼容性:访问您的组" -#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:59 msgid "authentik API Access on behalf of your user" msgstr "代表您的用户访问 authentik API" @@ -1187,7 +1211,7 @@ msgstr "代表您的用户访问 authentik API" msgid "User and password attributes must be set when basic auth is enabled." msgstr "启用 Basic Auth 时,必须设置用户和密码属性。" -#: authentik/providers/proxy/api.py:62 +#: authentik/providers/proxy/api.py:63 msgid "Internal host cannot be empty when forward auth is disabled." msgstr "禁用 Forward Auth 时,内部主机不能为空。" @@ -1273,11 +1297,11 @@ msgstr "Radius 提供程序" msgid "Radius Providers" msgstr "Radius 提供程序" -#: authentik/providers/saml/api/providers.py:260 +#: authentik/providers/saml/api/providers.py:257 msgid "Invalid XML Syntax" msgstr "无效 XML 语法" -#: authentik/providers/saml/api/providers.py:270 +#: authentik/providers/saml/api/providers.py:267 #, python-format msgid "Failed to import Metadata: %(message)s" msgstr "导入元数据失败:%(message)s" @@ -1404,31 +1428,31 @@ msgstr "SAML 属性映射" msgid "SAML Property Mappings" msgstr "SAML 属性映射" -#: authentik/providers/scim/models.py:26 +#: authentik/providers/scim/models.py:20 msgid "Base URL to SCIM requests, usually ends in /v2" msgstr "SCIM 请求的基础 URL,通常以 /v2 结尾" -#: authentik/providers/scim/models.py:27 +#: authentik/providers/scim/models.py:21 msgid "Authentication token" msgstr "身份验证令牌" -#: authentik/providers/scim/models.py:33 authentik/sources/ldap/models.py:94 +#: authentik/providers/scim/models.py:27 authentik/sources/ldap/models.py:94 msgid "Property mappings used for group creation/updating." msgstr "用于创建/更新组的属性映射。" -#: authentik/providers/scim/models.py:75 +#: authentik/providers/scim/models.py:60 msgid "SCIM Provider" msgstr "SCIM 提供程序" -#: authentik/providers/scim/models.py:76 +#: authentik/providers/scim/models.py:61 msgid "SCIM Providers" msgstr "SCIM 提供程序" -#: authentik/providers/scim/models.py:96 +#: authentik/providers/scim/models.py:81 msgid "SCIM Mapping" msgstr "SCIM 映射" -#: authentik/providers/scim/models.py:97 +#: authentik/providers/scim/models.py:82 msgid "SCIM Mappings" msgstr "SCIM 映射" @@ -1558,7 +1582,7 @@ msgstr "LDAP 属性映射" msgid "LDAP Property Mappings" msgstr "LDAP 属性映射" -#: authentik/sources/ldap/signals.py:59 +#: authentik/sources/ldap/signals.py:50 msgid "Password does not match Active Directory Complexity." msgstr "密码与 Active Directory 复杂度不匹配。" @@ -1898,8 +1922,8 @@ msgid "SMS Devices" msgstr "短信设备" #: authentik/stages/authenticator_sms/stage.py:55 -#: authentik/stages/authenticator_totp/stage.py:42 -#: authentik/stages/authenticator_totp/stage.py:45 +#: authentik/stages/authenticator_totp/stage.py:41 +#: authentik/stages/authenticator_totp/stage.py:44 msgid "Code does not match" msgstr "代码不匹配" @@ -1907,31 +1931,47 @@ msgstr "代码不匹配" msgid "Invalid phone number" msgstr "无效电话号码" -#: authentik/stages/authenticator_static/models.py:46 +#: authentik/stages/authenticator_static/models.py:52 msgid "Static Authenticator Stage" msgstr "静态身份验证器阶段" -#: authentik/stages/authenticator_static/models.py:47 +#: authentik/stages/authenticator_static/models.py:53 msgid "Static Authenticator Stages" msgstr "静态身份验证器阶段" -#: authentik/stages/authenticator_totp/models.py:16 +#: authentik/stages/authenticator_static/models.py:98 +msgid "Static device" +msgstr "静态设备" + +#: authentik/stages/authenticator_static/models.py:99 +msgid "Static devices" +msgstr "静态设备" + +#: authentik/stages/authenticator_totp/models.py:25 msgid "6 digits, widely compatible" msgstr "6 位数字,广泛兼容" -#: authentik/stages/authenticator_totp/models.py:17 +#: authentik/stages/authenticator_totp/models.py:26 msgid "8 digits, not compatible with apps like Google Authenticator" msgstr "8 位数字,与 Google 身份验证器等应用不兼容" -#: authentik/stages/authenticator_totp/models.py:53 +#: authentik/stages/authenticator_totp/models.py:62 msgid "TOTP Authenticator Setup Stage" msgstr "TOTP 身份验证器设置阶段" -#: authentik/stages/authenticator_totp/models.py:54 +#: authentik/stages/authenticator_totp/models.py:63 msgid "TOTP Authenticator Setup Stages" msgstr "TOTP 身份验证器设置阶段" -#: authentik/stages/authenticator_validate/challenge.py:123 +#: authentik/stages/authenticator_totp/models.py:244 +msgid "TOTP device" +msgstr "TOTP 设备" + +#: authentik/stages/authenticator_totp/models.py:245 +msgid "TOTP devices" +msgstr "TOTP 设备" + +#: authentik/stages/authenticator_validate/challenge.py:131 msgid "Invalid Token" msgstr "无效令牌" @@ -2053,45 +2093,45 @@ msgstr "虚拟阶段" msgid "Dummy Stages" msgstr "虚拟阶段" -#: authentik/stages/email/models.py:25 +#: authentik/stages/email/models.py:26 msgid "Password Reset" msgstr "密码重置" -#: authentik/stages/email/models.py:29 +#: authentik/stages/email/models.py:30 msgid "Account Confirmation" msgstr "账户确认" -#: authentik/stages/email/models.py:58 +#: authentik/stages/email/models.py:59 msgid "" "When enabled, global Email connection settings will be used and connection " "settings below will be ignored." msgstr "启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。" -#: authentik/stages/email/models.py:73 +#: authentik/stages/email/models.py:74 msgid "Activate users upon completion of stage." msgstr "完成阶段后激活用户。" -#: authentik/stages/email/models.py:77 +#: authentik/stages/email/models.py:78 msgid "Time in minutes the token sent is valid." msgstr "发出令牌的有效时间(单位为分钟)。" -#: authentik/stages/email/models.py:122 +#: authentik/stages/email/models.py:132 msgid "Email Stage" msgstr "电子邮件阶段" -#: authentik/stages/email/models.py:123 +#: authentik/stages/email/models.py:133 msgid "Email Stages" msgstr "电子邮件阶段" -#: authentik/stages/email/stage.py:112 +#: authentik/stages/email/stage.py:117 msgid "Successfully verified Email." msgstr "已成功验证电子邮件。" -#: authentik/stages/email/stage.py:119 authentik/stages/email/stage.py:141 +#: authentik/stages/email/stage.py:124 authentik/stages/email/stage.py:146 msgid "No pending user." msgstr "没有待处理的用户。" -#: authentik/stages/email/stage.py:131 +#: authentik/stages/email/stage.py:136 msgid "Email sent." msgstr "电子邮件已发出。" @@ -2225,11 +2265,11 @@ msgstr "识别阶段" msgid "Identification Stages" msgstr "识别阶段" -#: authentik/stages/identification/stage.py:184 +#: authentik/stages/identification/stage.py:188 msgid "Log in" msgstr "登录" -#: authentik/stages/identification/stage.py:185 +#: authentik/stages/identification/stage.py:189 msgid "Continue" msgstr "继续" @@ -2268,7 +2308,7 @@ msgstr "邀请" msgid "Invitations" msgstr "邀请" -#: authentik/stages/invitation/stage.py:66 +#: authentik/stages/invitation/stage.py:62 msgid "Invalid invite/invite not found" msgstr "邀请无效/未找到" @@ -2302,7 +2342,7 @@ msgstr "密码阶段" msgid "Password Stages" msgstr "密码阶段" -#: authentik/stages/password/stage.py:159 +#: authentik/stages/password/stage.py:124 msgid "Invalid password" msgstr "无效密码" @@ -2414,7 +2454,7 @@ msgstr "用户删除阶段" msgid "User Delete Stages" msgstr "用户删除阶段" -#: authentik/stages/user_delete/stage.py:22 +#: authentik/stages/user_delete/stage.py:18 msgid "No Pending User." msgstr "没有待处理的用户。" @@ -2445,11 +2485,11 @@ msgstr "用户登录阶段" msgid "User Login Stages" msgstr "用户登录阶段" -#: authentik/stages/user_login/stage.py:63 +#: authentik/stages/user_login/stage.py:57 msgid "No Pending user to login." msgstr "没有待定用户可以登录。" -#: authentik/stages/user_login/stage.py:96 +#: authentik/stages/user_login/stage.py:90 msgid "Successfully logged in!" msgstr "已成功登录!" @@ -2477,16 +2517,16 @@ msgstr "用户写入阶段" msgid "User Write Stages" msgstr "用户写入阶段" -#: authentik/stages/user_write/stage.py:133 +#: authentik/stages/user_write/stage.py:130 msgid "No Pending data." msgstr "没有待处理的数据。" -#: authentik/stages/user_write/stage.py:139 +#: authentik/stages/user_write/stage.py:136 msgid "No user found and can't create new user." msgstr "未找到用户并且无法创建新用户。" -#: authentik/stages/user_write/stage.py:156 -#: authentik/stages/user_write/stage.py:170 +#: authentik/stages/user_write/stage.py:153 +#: authentik/stages/user_write/stage.py:167 msgid "Failed to update user. Please try again later." msgstr "更新用户失败。请稍后重试。" diff --git a/locale/zh_CN/LC_MESSAGES/django.po b/locale/zh_CN/LC_MESSAGES/django.po index da14ff132..89615b879 100644 --- a/locale/zh_CN/LC_MESSAGES/django.po +++ b/locale/zh_CN/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-19 17:34+0000\n" +"POT-Creation-Date: 2023-09-15 09:51+0000\n" "PO-Revision-Date: 2022-09-26 16:47+0000\n" "Last-Translator: deluxghost, 2023\n" "Language-Team: Chinese (China) (https://app.transifex.com/authentik/teams/119923/zh_CN/)\n" @@ -29,11 +29,11 @@ msgstr "" msgid "Successfully re-scheduled Task %(name)s!" msgstr "已成功重新安排任务 %(name)s!" -#: authentik/api/schema.py:21 +#: authentik/api/schema.py:25 msgid "Generic API Error" msgstr "通用 API 错误" -#: authentik/api/schema.py:29 +#: authentik/api/schema.py:33 msgid "Validation Error" msgstr "校验错误" @@ -64,11 +64,11 @@ msgstr "" "由 authentik 管理的对象。这些对象会自动创建和更新。此标记仅仅表明对象可以被 Migration 覆盖。您仍然可以通过 API " "修改对象,但这些修改可能会在之后的更新中被覆盖。" -#: authentik/blueprints/models.py:109 +#: authentik/blueprints/models.py:112 msgid "Blueprint Instance" msgstr "蓝图实例" -#: authentik/blueprints/models.py:110 +#: authentik/blueprints/models.py:113 msgid "Blueprint Instances" msgstr "蓝图实例" @@ -90,167 +90,167 @@ msgstr "来自元数据的 SAML 提供程序" msgid "Create a SAML Provider by importing its Metadata." msgstr "通过导入元数据来创建 SAML 提供程序。" -#: authentik/core/api/users.py:143 +#: authentik/core/api/users.py:158 msgid "No leading or trailing slashes allowed." msgstr "不允许前缀或后缀斜线。" -#: authentik/core/api/users.py:146 +#: authentik/core/api/users.py:161 msgid "No empty segments in user path allowed." msgstr "不允许用户路径包含空段。" -#: authentik/core/models.py:74 +#: authentik/core/models.py:86 msgid "name" msgstr "名称" -#: authentik/core/models.py:76 +#: authentik/core/models.py:88 msgid "Users added to this group will be superusers." msgstr "添加到该组的用户均为超级用户。" -#: authentik/core/models.py:150 +#: authentik/core/models.py:142 msgid "User's display name." msgstr "用户的显示名称。" -#: authentik/core/models.py:243 authentik/providers/oauth2/models.py:294 +#: authentik/core/models.py:268 authentik/providers/oauth2/models.py:295 msgid "User" msgstr "用户" -#: authentik/core/models.py:244 +#: authentik/core/models.py:269 msgid "Users" msgstr "用户" -#: authentik/core/models.py:257 +#: authentik/core/models.py:282 msgid "" "Flow used for authentication when the associated application is accessed by " "an un-authenticated user." msgstr "当关联应用程序被未验证身份的用户访问时,用于身份验证的流程。" -#: authentik/core/models.py:267 +#: authentik/core/models.py:292 msgid "Flow used when authorizing this provider." msgstr "授权此提供程序时使用的流程。" -#: authentik/core/models.py:279 +#: authentik/core/models.py:304 msgid "" "Accessed from applications; optional backchannel providers for protocols " "like LDAP and SCIM." msgstr "从应用程序访问;为类似 LDAP 和 SCIM 的协议提供的可选反向通道提供程序。" -#: authentik/core/models.py:334 +#: authentik/core/models.py:359 msgid "Application's display Name." msgstr "应用的显示名称。" -#: authentik/core/models.py:335 +#: authentik/core/models.py:360 msgid "Internal application name, used in URLs." msgstr "应用的内部名称,在 URL 中使用。" -#: authentik/core/models.py:347 +#: authentik/core/models.py:372 msgid "Open launch URL in a new browser tab or window." msgstr "在新浏览器标签页或窗口中打开启动 URL。" -#: authentik/core/models.py:411 +#: authentik/core/models.py:436 msgid "Application" msgstr "应用程序" -#: authentik/core/models.py:412 +#: authentik/core/models.py:437 msgid "Applications" msgstr "应用程序" -#: authentik/core/models.py:418 +#: authentik/core/models.py:443 msgid "Use the source-specific identifier" msgstr "使用源特定的标识符" -#: authentik/core/models.py:420 +#: authentik/core/models.py:445 msgid "" "Link to a user with identical email address. Can have security implications " "when a source doesn't validate email addresses." msgstr "链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患。" -#: authentik/core/models.py:424 +#: authentik/core/models.py:449 msgid "" "Use the user's email address, but deny enrollment when the email address " "already exists." msgstr "使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册。" -#: authentik/core/models.py:427 +#: authentik/core/models.py:452 msgid "" "Link to a user with identical username. Can have security implications when " "a username is used with another source." msgstr "链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患。" -#: authentik/core/models.py:431 +#: authentik/core/models.py:456 msgid "" "Use the user's username, but deny enrollment when the username already " "exists." msgstr "使用用户的用户名,但在用户名已存在时拒绝注册。" -#: authentik/core/models.py:438 +#: authentik/core/models.py:463 msgid "Source's display Name." msgstr "源的显示名称。" -#: authentik/core/models.py:439 +#: authentik/core/models.py:464 msgid "Internal source name, used in URLs." msgstr "源的内部名称,在 URL 中使用。" -#: authentik/core/models.py:458 +#: authentik/core/models.py:483 msgid "Flow to use when authenticating existing users." msgstr "认证已存在用户时所使用的流程。" -#: authentik/core/models.py:467 +#: authentik/core/models.py:492 msgid "Flow to use when enrolling new users." msgstr "新用户注册的流程。" -#: authentik/core/models.py:475 +#: authentik/core/models.py:500 msgid "" "How the source determines if an existing user should be authenticated or a " "new user enrolled." msgstr "源怎样确定应该验证已有用户的身份还是注册新用户。" -#: authentik/core/models.py:647 +#: authentik/core/models.py:672 msgid "Token" msgstr "令牌" -#: authentik/core/models.py:648 +#: authentik/core/models.py:673 msgid "Tokens" msgstr "令牌" -#: authentik/core/models.py:689 +#: authentik/core/models.py:714 msgid "Property Mapping" msgstr "属性映射" -#: authentik/core/models.py:690 +#: authentik/core/models.py:715 msgid "Property Mappings" msgstr "属性映射" -#: authentik/core/models.py:725 +#: authentik/core/models.py:750 msgid "Authenticated Session" msgstr "已认证会话" -#: authentik/core/models.py:726 +#: authentik/core/models.py:751 msgid "Authenticated Sessions" msgstr "已认证会话" -#: authentik/core/sources/flow_manager.py:193 +#: authentik/core/sources/flow_manager.py:189 #, python-format msgid "" "Request to authenticate with %(source)s has been denied. Please authenticate" " with the source you've previously signed up with." msgstr "来自 %(source)s 的身份验证请求被拒绝。请用您注册时使用的方式验证身份。" -#: authentik/core/sources/flow_manager.py:245 +#: authentik/core/sources/flow_manager.py:241 msgid "Configured flow does not exist." msgstr "配置的流程不存在。" -#: authentik/core/sources/flow_manager.py:275 -#: authentik/core/sources/flow_manager.py:327 +#: authentik/core/sources/flow_manager.py:271 +#: authentik/core/sources/flow_manager.py:323 #, python-format msgid "Successfully authenticated with %(source)s!" msgstr "成功通过 %(source)s 认证!" -#: authentik/core/sources/flow_manager.py:299 +#: authentik/core/sources/flow_manager.py:295 #, python-format msgid "Successfully linked %(source)s!" msgstr "成功链接 %(source)s!" -#: authentik/core/sources/flow_manager.py:318 +#: authentik/core/sources/flow_manager.py:314 msgid "Source is not configured for enrollment." msgstr "源未被配置用于注册。" @@ -307,12 +307,12 @@ msgstr "" msgid "Go home" msgstr "前往首页" -#: authentik/core/templates/login/base_full.html:90 +#: authentik/core/templates/login/base_full.html:89 msgid "Powered by authentik" msgstr "由 authentik 强力驱动" #: authentik/core/views/apps.py:53 -#: authentik/providers/oauth2/views/authorize.py:386 +#: authentik/providers/oauth2/views/authorize.py:393 #: authentik/providers/oauth2/views/device_init.py:70 #: authentik/providers/saml/views/sso.py:70 #, python-format @@ -341,6 +341,14 @@ msgstr "证书密钥对" msgid "Certificate-Key Pairs" msgstr "证书密钥对" +#: authentik/enterprise/models.py:193 +msgid "License Usage" +msgstr "许可证使用情况" + +#: authentik/enterprise/models.py:194 +msgid "License Usage Records" +msgstr "许可证使用情况记录" + #: authentik/events/models.py:290 msgid "Event" msgstr "事件" @@ -443,7 +451,7 @@ msgstr "Webhook 映射" msgid "Webhook Mappings" msgstr "Webhook 映射" -#: authentik/events/monitored_tasks.py:195 +#: authentik/events/monitored_tasks.py:205 msgid "Task has not been run yet." msgstr "任务尚未运行。" @@ -452,55 +460,55 @@ msgstr "任务尚未运行。" msgid "Flow not applicable to current user/request: %(messages)s" msgstr "流程不适用于当前用户/请求:%(messages)s" -#: authentik/flows/api/flows_diagram.py:67 -#: authentik/flows/api/flows_diagram.py:93 +#: authentik/flows/api/flows_diagram.py:68 +#: authentik/flows/api/flows_diagram.py:94 #, python-format msgid "Policy (%(type)s)" msgstr "策略(%(type)s)" -#: authentik/flows/api/flows_diagram.py:70 +#: authentik/flows/api/flows_diagram.py:71 #, python-format msgid "Binding %(order)d" msgstr "绑定 %(order)d" -#: authentik/flows/api/flows_diagram.py:117 +#: authentik/flows/api/flows_diagram.py:118 msgid "Policy passed" msgstr "策略通过" -#: authentik/flows/api/flows_diagram.py:121 +#: authentik/flows/api/flows_diagram.py:122 #, python-format msgid "Stage (%(type)s)" msgstr "阶段(%(type)s)" -#: authentik/flows/api/flows_diagram.py:145 -#: authentik/flows/api/flows_diagram.py:205 +#: authentik/flows/api/flows_diagram.py:146 +#: authentik/flows/api/flows_diagram.py:206 msgid "Policy denied" msgstr "策略拒绝" -#: authentik/flows/api/flows_diagram.py:155 -#: authentik/flows/api/flows_diagram.py:167 -#: authentik/flows/api/flows_diagram.py:204 -#: authentik/flows/api/flows_diagram.py:226 +#: authentik/flows/api/flows_diagram.py:156 +#: authentik/flows/api/flows_diagram.py:168 +#: authentik/flows/api/flows_diagram.py:205 +#: authentik/flows/api/flows_diagram.py:227 msgid "End of the flow" msgstr "流程结束" -#: authentik/flows/api/flows_diagram.py:168 +#: authentik/flows/api/flows_diagram.py:169 msgid "Requirement not fulfilled" msgstr "需求条件未达成" -#: authentik/flows/api/flows_diagram.py:176 +#: authentik/flows/api/flows_diagram.py:177 msgid "Flow authentication requirement" msgstr "流程身份验证需求" -#: authentik/flows/api/flows_diagram.py:182 +#: authentik/flows/api/flows_diagram.py:183 msgid "Requirement fulfilled" msgstr "需求条件已达成" -#: authentik/flows/api/flows_diagram.py:195 +#: authentik/flows/api/flows_diagram.py:196 msgid "Pre-flow policies" msgstr "流程前置策略" -#: authentik/flows/api/flows_diagram.py:213 authentik/flows/models.py:193 +#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:193 msgid "Flow" msgstr "流程" @@ -682,14 +690,14 @@ msgid "Dummy Policies" msgstr "虚拟策略" #: authentik/policies/event_matcher/api.py:20 -#: authentik/policies/event_matcher/models.py:55 +#: authentik/policies/event_matcher/models.py:56 msgid "" "Match events created by selected application. When left empty, all " "applications are matched." msgstr "匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。" #: authentik/policies/event_matcher/api.py:29 -#: authentik/policies/event_matcher/models.py:63 +#: authentik/policies/event_matcher/models.py:64 msgid "" "Match events created by selected model. When left empty, all models are " "matched. When an app is selected, all the application's models are matched." @@ -699,23 +707,23 @@ msgstr "匹配选定模型创建的事件。如果留空,则匹配所有模型 msgid "At least one criteria must be set." msgstr "必须至少设置一项标准。" -#: authentik/policies/event_matcher/models.py:47 +#: authentik/policies/event_matcher/models.py:48 msgid "" "Match created events with this action type. When left empty, all action " "types will be matched." msgstr "将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。" -#: authentik/policies/event_matcher/models.py:71 +#: authentik/policies/event_matcher/models.py:73 msgid "" "Matches Event's Client IP (strict matching, for network matching use an " "Expression Policy)" msgstr "匹配事件的客户端 IP(严格匹配,要匹配网段请使用表达式策略)" -#: authentik/policies/event_matcher/models.py:141 +#: authentik/policies/event_matcher/models.py:143 msgid "Event Matcher Policy" msgstr "事件匹配策略" -#: authentik/policies/event_matcher/models.py:142 +#: authentik/policies/event_matcher/models.py:144 msgid "Event Matcher Policies" msgstr "事件匹配策略" @@ -768,25 +776,29 @@ msgstr "反转策略的结果。消息不受影响。" msgid "Timeout after which Policy execution is terminated." msgstr "策略执行终止的超时时间。" -#: authentik/policies/models.py:142 +#: authentik/policies/models.py:92 +msgid "Result if the Policy execution fails." +msgstr "策略执行失败时的结果。" + +#: authentik/policies/models.py:145 msgid "Policy Binding" msgstr "策略绑定" -#: authentik/policies/models.py:143 +#: authentik/policies/models.py:146 msgid "Policy Bindings" msgstr "策略绑定" -#: authentik/policies/models.py:164 +#: authentik/policies/models.py:167 msgid "" "When this option is enabled, all executions of this policy will be logged. " "By default, only execution errors are logged." msgstr "启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。" -#: authentik/policies/models.py:186 +#: authentik/policies/models.py:189 msgid "Policy" msgstr "策略" -#: authentik/policies/models.py:187 +#: authentik/policies/models.py:190 msgid "Policies" msgstr "策略" @@ -824,14 +836,26 @@ msgstr "密码策略" msgid "Password Policies" msgstr "密码策略" -#: authentik/policies/reputation/models.py:58 +#: authentik/policies/reputation/api.py:18 +msgid "Either IP or Username must be checked" +msgstr "必须检查 IP 或用户名" + +#: authentik/policies/reputation/models.py:67 msgid "Reputation Policy" msgstr "信誉策略" -#: authentik/policies/reputation/models.py:59 +#: authentik/policies/reputation/models.py:68 msgid "Reputation Policies" msgstr "信誉策略" +#: authentik/policies/reputation/models.py:95 +msgid "Reputation Score" +msgstr "信誉分数" + +#: authentik/policies/reputation/models.py:96 +msgid "Reputation Scores" +msgstr "信誉分数" + #: authentik/policies/templates/policies/denied.html:7 #: authentik/policies/templates/policies/denied.html:11 msgid "Permission denied" @@ -946,217 +970,217 @@ msgid "" "this method only if you have different UPN and Mail domains." msgstr "基于用户的 UPN,仅当用户设置了 'upn' 属性时才有效。仅当您有不同的 UPN 和 Mail 域时才使用此方法。" -#: authentik/providers/oauth2/models.py:42 +#: authentik/providers/oauth2/models.py:43 msgid "Confidential" msgstr "机密" -#: authentik/providers/oauth2/models.py:43 +#: authentik/providers/oauth2/models.py:44 msgid "Public" msgstr "公开" -#: authentik/providers/oauth2/models.py:65 +#: authentik/providers/oauth2/models.py:66 msgid "Same identifier is used for all providers" msgstr "所有提供程序都使用相同的标识符" -#: authentik/providers/oauth2/models.py:67 +#: authentik/providers/oauth2/models.py:68 msgid "Each provider has a different issuer, based on the application slug." msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。" -#: authentik/providers/oauth2/models.py:74 +#: authentik/providers/oauth2/models.py:75 msgid "code (Authorization Code Flow)" msgstr "code(授权码流程)" -#: authentik/providers/oauth2/models.py:75 +#: authentik/providers/oauth2/models.py:76 msgid "id_token (Implicit Flow)" msgstr "id_token(隐式流程)" -#: authentik/providers/oauth2/models.py:76 +#: authentik/providers/oauth2/models.py:77 msgid "id_token token (Implicit Flow)" msgstr "id_token token(隐式流程)" -#: authentik/providers/oauth2/models.py:77 +#: authentik/providers/oauth2/models.py:78 msgid "code token (Hybrid Flow)" msgstr "code token(混合流程)" -#: authentik/providers/oauth2/models.py:78 +#: authentik/providers/oauth2/models.py:79 msgid "code id_token (Hybrid Flow)" msgstr "code id_token(混合流程)" -#: authentik/providers/oauth2/models.py:79 +#: authentik/providers/oauth2/models.py:80 msgid "code id_token token (Hybrid Flow)" msgstr "code id_token token(混合流程)" -#: authentik/providers/oauth2/models.py:85 +#: authentik/providers/oauth2/models.py:86 msgid "HS256 (Symmetric Encryption)" msgstr "HS256(对称加密)" -#: authentik/providers/oauth2/models.py:86 +#: authentik/providers/oauth2/models.py:87 msgid "RS256 (Asymmetric Encryption)" msgstr "RS256(非对称加密)" -#: authentik/providers/oauth2/models.py:87 +#: authentik/providers/oauth2/models.py:88 msgid "ES256 (Asymmetric Encryption)" msgstr "ES256(非对称加密)" -#: authentik/providers/oauth2/models.py:93 +#: authentik/providers/oauth2/models.py:94 msgid "Scope used by the client" msgstr "客户端使用的作用域" -#: authentik/providers/oauth2/models.py:97 +#: authentik/providers/oauth2/models.py:98 msgid "" "Description shown to the user when consenting. If left empty, the user won't" " be informed." msgstr "同意授权时向用户显示的描述。如果留空,则不会告知用户。" -#: authentik/providers/oauth2/models.py:116 +#: authentik/providers/oauth2/models.py:117 msgid "Scope Mapping" msgstr "作用域映射" -#: authentik/providers/oauth2/models.py:117 +#: authentik/providers/oauth2/models.py:118 msgid "Scope Mappings" msgstr "作用域映射" -#: authentik/providers/oauth2/models.py:127 +#: authentik/providers/oauth2/models.py:128 msgid "Client Type" msgstr "客户端类型" -#: authentik/providers/oauth2/models.py:129 +#: authentik/providers/oauth2/models.py:130 msgid "" "Confidential clients are capable of maintaining the confidentiality of their" " credentials. Public clients are incapable" msgstr "机密客户端有能力维护其凭据的机密性。公开客户端无此能力。" -#: authentik/providers/oauth2/models.py:136 +#: authentik/providers/oauth2/models.py:137 msgid "Client ID" msgstr "客户端 ID" -#: authentik/providers/oauth2/models.py:142 +#: authentik/providers/oauth2/models.py:143 msgid "Client Secret" msgstr "客户端密钥" -#: authentik/providers/oauth2/models.py:148 +#: authentik/providers/oauth2/models.py:149 msgid "Redirect URIs" msgstr "重定向 URI" -#: authentik/providers/oauth2/models.py:149 +#: authentik/providers/oauth2/models.py:150 msgid "Enter each URI on a new line." msgstr "每行输入一个 URI。" -#: authentik/providers/oauth2/models.py:154 +#: authentik/providers/oauth2/models.py:155 msgid "Include claims in id_token" msgstr "在 id_token 中包含声明" -#: authentik/providers/oauth2/models.py:156 +#: authentik/providers/oauth2/models.py:157 msgid "" "Include User claims from scopes in the id_token, for applications that don't" " access the userinfo endpoint." msgstr "对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。" -#: authentik/providers/oauth2/models.py:165 +#: authentik/providers/oauth2/models.py:166 msgid "" "Access codes not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." msgstr "从当前时间经过多久时或之后,访问代码无效(格式:hours=1;minutes=2;seconds=3)。" -#: authentik/providers/oauth2/models.py:173 -#: authentik/providers/oauth2/models.py:181 +#: authentik/providers/oauth2/models.py:174 +#: authentik/providers/oauth2/models.py:182 msgid "" "Tokens not valid on or after current time + this value (Format: " "hours=1;minutes=2;seconds=3)." msgstr "从当前时间经过多久时或之后,令牌无效(格式:hours=1;minutes=2;seconds=3)。" -#: authentik/providers/oauth2/models.py:190 +#: authentik/providers/oauth2/models.py:191 msgid "" "Configure what data should be used as unique User Identifier. For most " "cases, the default should be fine." msgstr "配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。" -#: authentik/providers/oauth2/models.py:197 +#: authentik/providers/oauth2/models.py:198 msgid "Configure how the issuer field of the ID Token should be filled." msgstr "配置如何填写 ID 令牌的颁发者字段。" -#: authentik/providers/oauth2/models.py:202 +#: authentik/providers/oauth2/models.py:203 msgid "Signing Key" msgstr "签名密钥" -#: authentik/providers/oauth2/models.py:206 +#: authentik/providers/oauth2/models.py:207 msgid "" "Key used to sign the tokens. Only required when JWT Algorithm is set to " "RS256." msgstr "用于签名令牌的密钥。仅当 JWT 算法设置为 RS256 时才需要。" -#: authentik/providers/oauth2/models.py:213 +#: authentik/providers/oauth2/models.py:214 msgid "" "Any JWT signed by the JWK of the selected source can be used to " "authenticate." msgstr "任何由选定来源的 JWK 签发的 JWT 都可以用于身份验证。" -#: authentik/providers/oauth2/models.py:286 +#: authentik/providers/oauth2/models.py:287 msgid "OAuth2/OpenID Provider" msgstr "OAuth2/OpenID 提供程序" -#: authentik/providers/oauth2/models.py:287 +#: authentik/providers/oauth2/models.py:288 msgid "OAuth2/OpenID Providers" msgstr "OAuth2/OpenID 提供程序" -#: authentik/providers/oauth2/models.py:296 -#: authentik/providers/oauth2/models.py:428 +#: authentik/providers/oauth2/models.py:297 +#: authentik/providers/oauth2/models.py:429 msgid "Scopes" msgstr "作用域" -#: authentik/providers/oauth2/models.py:315 +#: authentik/providers/oauth2/models.py:316 msgid "Code" msgstr "代码" -#: authentik/providers/oauth2/models.py:316 +#: authentik/providers/oauth2/models.py:317 msgid "Nonce" msgstr "Nonce" -#: authentik/providers/oauth2/models.py:317 +#: authentik/providers/oauth2/models.py:318 msgid "Code Challenge" msgstr "代码质询" -#: authentik/providers/oauth2/models.py:319 +#: authentik/providers/oauth2/models.py:320 msgid "Code Challenge Method" msgstr "代码质询方法" -#: authentik/providers/oauth2/models.py:339 +#: authentik/providers/oauth2/models.py:340 msgid "Authorization Code" msgstr "授权代码" -#: authentik/providers/oauth2/models.py:340 +#: authentik/providers/oauth2/models.py:341 msgid "Authorization Codes" msgstr "授权代码" -#: authentik/providers/oauth2/models.py:382 +#: authentik/providers/oauth2/models.py:383 msgid "OAuth2 Access Token" msgstr "OAuth2 访问令牌" -#: authentik/providers/oauth2/models.py:383 +#: authentik/providers/oauth2/models.py:384 msgid "OAuth2 Access Tokens" msgstr "OAuth2 访问令牌" -#: authentik/providers/oauth2/models.py:393 +#: authentik/providers/oauth2/models.py:394 msgid "ID Token" msgstr "ID 令牌" -#: authentik/providers/oauth2/models.py:412 +#: authentik/providers/oauth2/models.py:413 msgid "OAuth2 Refresh Token" msgstr "OAuth2 刷新令牌" -#: authentik/providers/oauth2/models.py:413 +#: authentik/providers/oauth2/models.py:414 msgid "OAuth2 Refresh Tokens" msgstr "OAuth2 刷新令牌" -#: authentik/providers/oauth2/models.py:440 +#: authentik/providers/oauth2/models.py:441 msgid "Device Token" msgstr "设备令牌" -#: authentik/providers/oauth2/models.py:441 +#: authentik/providers/oauth2/models.py:442 msgid "Device Tokens" msgstr "设备令牌" -#: authentik/providers/oauth2/views/authorize.py:441 +#: authentik/providers/oauth2/views/authorize.py:448 #: authentik/providers/saml/views/flows.py:87 #, python-format msgid "Redirecting to %(app)s..." @@ -1166,20 +1190,20 @@ msgstr "正在跳转到 %(app)s…" msgid "Invalid code" msgstr "无效代码" -#: authentik/providers/oauth2/views/userinfo.py:51 -#: authentik/providers/oauth2/views/userinfo.py:52 +#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:56 msgid "GitHub Compatibility: Access your User Information" msgstr "GitHub 兼容性:访问您的用户信息" -#: authentik/providers/oauth2/views/userinfo.py:53 +#: authentik/providers/oauth2/views/userinfo.py:57 msgid "GitHub Compatibility: Access you Email addresses" msgstr "GitHub 兼容性:访问您的电子邮件地址" -#: authentik/providers/oauth2/views/userinfo.py:54 +#: authentik/providers/oauth2/views/userinfo.py:58 msgid "GitHub Compatibility: Access your Groups" msgstr "GitHub 兼容性:访问您的组" -#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:59 msgid "authentik API Access on behalf of your user" msgstr "代表您的用户访问 authentik API" @@ -1187,7 +1211,7 @@ msgstr "代表您的用户访问 authentik API" msgid "User and password attributes must be set when basic auth is enabled." msgstr "启用 Basic Auth 时,必须设置用户和密码属性。" -#: authentik/providers/proxy/api.py:62 +#: authentik/providers/proxy/api.py:63 msgid "Internal host cannot be empty when forward auth is disabled." msgstr "禁用 Forward Auth 时,内部主机不能为空。" @@ -1273,11 +1297,11 @@ msgstr "Radius 提供程序" msgid "Radius Providers" msgstr "Radius 提供程序" -#: authentik/providers/saml/api/providers.py:260 +#: authentik/providers/saml/api/providers.py:257 msgid "Invalid XML Syntax" msgstr "无效 XML 语法" -#: authentik/providers/saml/api/providers.py:270 +#: authentik/providers/saml/api/providers.py:267 #, python-format msgid "Failed to import Metadata: %(message)s" msgstr "导入元数据失败:%(message)s" @@ -1404,31 +1428,31 @@ msgstr "SAML 属性映射" msgid "SAML Property Mappings" msgstr "SAML 属性映射" -#: authentik/providers/scim/models.py:26 +#: authentik/providers/scim/models.py:20 msgid "Base URL to SCIM requests, usually ends in /v2" msgstr "SCIM 请求的基础 URL,通常以 /v2 结尾" -#: authentik/providers/scim/models.py:27 +#: authentik/providers/scim/models.py:21 msgid "Authentication token" msgstr "身份验证令牌" -#: authentik/providers/scim/models.py:33 authentik/sources/ldap/models.py:94 +#: authentik/providers/scim/models.py:27 authentik/sources/ldap/models.py:94 msgid "Property mappings used for group creation/updating." msgstr "用于创建/更新组的属性映射。" -#: authentik/providers/scim/models.py:75 +#: authentik/providers/scim/models.py:60 msgid "SCIM Provider" msgstr "SCIM 提供程序" -#: authentik/providers/scim/models.py:76 +#: authentik/providers/scim/models.py:61 msgid "SCIM Providers" msgstr "SCIM 提供程序" -#: authentik/providers/scim/models.py:96 +#: authentik/providers/scim/models.py:81 msgid "SCIM Mapping" msgstr "SCIM 映射" -#: authentik/providers/scim/models.py:97 +#: authentik/providers/scim/models.py:82 msgid "SCIM Mappings" msgstr "SCIM 映射" @@ -1558,7 +1582,7 @@ msgstr "LDAP 属性映射" msgid "LDAP Property Mappings" msgstr "LDAP 属性映射" -#: authentik/sources/ldap/signals.py:59 +#: authentik/sources/ldap/signals.py:50 msgid "Password does not match Active Directory Complexity." msgstr "密码与 Active Directory 复杂度不匹配。" @@ -1898,8 +1922,8 @@ msgid "SMS Devices" msgstr "短信设备" #: authentik/stages/authenticator_sms/stage.py:55 -#: authentik/stages/authenticator_totp/stage.py:42 -#: authentik/stages/authenticator_totp/stage.py:45 +#: authentik/stages/authenticator_totp/stage.py:41 +#: authentik/stages/authenticator_totp/stage.py:44 msgid "Code does not match" msgstr "代码不匹配" @@ -1907,31 +1931,47 @@ msgstr "代码不匹配" msgid "Invalid phone number" msgstr "无效电话号码" -#: authentik/stages/authenticator_static/models.py:46 +#: authentik/stages/authenticator_static/models.py:52 msgid "Static Authenticator Stage" msgstr "静态身份验证器阶段" -#: authentik/stages/authenticator_static/models.py:47 +#: authentik/stages/authenticator_static/models.py:53 msgid "Static Authenticator Stages" msgstr "静态身份验证器阶段" -#: authentik/stages/authenticator_totp/models.py:16 +#: authentik/stages/authenticator_static/models.py:98 +msgid "Static device" +msgstr "静态设备" + +#: authentik/stages/authenticator_static/models.py:99 +msgid "Static devices" +msgstr "静态设备" + +#: authentik/stages/authenticator_totp/models.py:25 msgid "6 digits, widely compatible" msgstr "6 位数字,广泛兼容" -#: authentik/stages/authenticator_totp/models.py:17 +#: authentik/stages/authenticator_totp/models.py:26 msgid "8 digits, not compatible with apps like Google Authenticator" msgstr "8 位数字,与 Google 身份验证器等应用不兼容" -#: authentik/stages/authenticator_totp/models.py:53 +#: authentik/stages/authenticator_totp/models.py:62 msgid "TOTP Authenticator Setup Stage" msgstr "TOTP 身份验证器设置阶段" -#: authentik/stages/authenticator_totp/models.py:54 +#: authentik/stages/authenticator_totp/models.py:63 msgid "TOTP Authenticator Setup Stages" msgstr "TOTP 身份验证器设置阶段" -#: authentik/stages/authenticator_validate/challenge.py:123 +#: authentik/stages/authenticator_totp/models.py:244 +msgid "TOTP device" +msgstr "TOTP 设备" + +#: authentik/stages/authenticator_totp/models.py:245 +msgid "TOTP devices" +msgstr "TOTP 设备" + +#: authentik/stages/authenticator_validate/challenge.py:131 msgid "Invalid Token" msgstr "无效令牌" @@ -2053,45 +2093,45 @@ msgstr "虚拟阶段" msgid "Dummy Stages" msgstr "虚拟阶段" -#: authentik/stages/email/models.py:25 +#: authentik/stages/email/models.py:26 msgid "Password Reset" msgstr "密码重置" -#: authentik/stages/email/models.py:29 +#: authentik/stages/email/models.py:30 msgid "Account Confirmation" msgstr "账户确认" -#: authentik/stages/email/models.py:58 +#: authentik/stages/email/models.py:59 msgid "" "When enabled, global Email connection settings will be used and connection " "settings below will be ignored." msgstr "启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。" -#: authentik/stages/email/models.py:73 +#: authentik/stages/email/models.py:74 msgid "Activate users upon completion of stage." msgstr "完成阶段后激活用户。" -#: authentik/stages/email/models.py:77 +#: authentik/stages/email/models.py:78 msgid "Time in minutes the token sent is valid." msgstr "发出令牌的有效时间(单位为分钟)。" -#: authentik/stages/email/models.py:122 +#: authentik/stages/email/models.py:132 msgid "Email Stage" msgstr "电子邮件阶段" -#: authentik/stages/email/models.py:123 +#: authentik/stages/email/models.py:133 msgid "Email Stages" msgstr "电子邮件阶段" -#: authentik/stages/email/stage.py:112 +#: authentik/stages/email/stage.py:117 msgid "Successfully verified Email." msgstr "已成功验证电子邮件。" -#: authentik/stages/email/stage.py:119 authentik/stages/email/stage.py:141 +#: authentik/stages/email/stage.py:124 authentik/stages/email/stage.py:146 msgid "No pending user." msgstr "没有待处理的用户。" -#: authentik/stages/email/stage.py:131 +#: authentik/stages/email/stage.py:136 msgid "Email sent." msgstr "电子邮件已发出。" @@ -2225,11 +2265,11 @@ msgstr "识别阶段" msgid "Identification Stages" msgstr "识别阶段" -#: authentik/stages/identification/stage.py:184 +#: authentik/stages/identification/stage.py:188 msgid "Log in" msgstr "登录" -#: authentik/stages/identification/stage.py:185 +#: authentik/stages/identification/stage.py:189 msgid "Continue" msgstr "继续" @@ -2268,7 +2308,7 @@ msgstr "邀请" msgid "Invitations" msgstr "邀请" -#: authentik/stages/invitation/stage.py:66 +#: authentik/stages/invitation/stage.py:62 msgid "Invalid invite/invite not found" msgstr "邀请无效/未找到" @@ -2302,7 +2342,7 @@ msgstr "密码阶段" msgid "Password Stages" msgstr "密码阶段" -#: authentik/stages/password/stage.py:159 +#: authentik/stages/password/stage.py:124 msgid "Invalid password" msgstr "无效密码" @@ -2414,7 +2454,7 @@ msgstr "用户删除阶段" msgid "User Delete Stages" msgstr "用户删除阶段" -#: authentik/stages/user_delete/stage.py:22 +#: authentik/stages/user_delete/stage.py:18 msgid "No Pending User." msgstr "没有待处理的用户。" @@ -2445,11 +2485,11 @@ msgstr "用户登录阶段" msgid "User Login Stages" msgstr "用户登录阶段" -#: authentik/stages/user_login/stage.py:63 +#: authentik/stages/user_login/stage.py:57 msgid "No Pending user to login." msgstr "没有待定用户可以登录。" -#: authentik/stages/user_login/stage.py:96 +#: authentik/stages/user_login/stage.py:90 msgid "Successfully logged in!" msgstr "已成功登录!" @@ -2477,16 +2517,16 @@ msgstr "用户写入阶段" msgid "User Write Stages" msgstr "用户写入阶段" -#: authentik/stages/user_write/stage.py:133 +#: authentik/stages/user_write/stage.py:130 msgid "No Pending data." msgstr "没有待处理的数据。" -#: authentik/stages/user_write/stage.py:139 +#: authentik/stages/user_write/stage.py:136 msgid "No user found and can't create new user." msgstr "未找到用户并且无法创建新用户。" -#: authentik/stages/user_write/stage.py:156 -#: authentik/stages/user_write/stage.py:170 +#: authentik/stages/user_write/stage.py:153 +#: authentik/stages/user_write/stage.py:167 msgid "Failed to update user. Please try again later." msgstr "更新用户失败。请稍后重试。" diff --git a/poetry.lock b/poetry.lock index d8cf8ee2a..4b0829e98 100644 --- a/poetry.lock +++ b/poetry.lock @@ -163,13 +163,13 @@ files = [ [[package]] name = "anyio" -version = "3.7.1" +version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, ] [package.dependencies] @@ -177,9 +177,9 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] [[package]] name = "argon2-cffi" @@ -280,13 +280,13 @@ wrapt = {version = ">=1.14,<2", markers = "python_version >= \"3.11\""} [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] @@ -355,13 +355,13 @@ visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] name = "autopep8" -version = "2.0.2" +version = "2.0.4" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" optional = false python-versions = ">=3.6" files = [ - {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, - {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, + {file = "autopep8-2.0.4-py2.py3-none-any.whl", hash = "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb"}, + {file = "autopep8-2.0.4.tar.gz", hash = "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c"}, ] [package.dependencies] @@ -437,33 +437,33 @@ files = [ [[package]] name = "black" -version = "23.7.0" +version = "23.9.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, - {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, - {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, - {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, - {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, - {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, - {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, - {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, - {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, - {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, - {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, ] [package.dependencies] @@ -552,13 +552,13 @@ test = ["pytest", "pytest-cov"] [[package]] name = "celery" -version = "5.3.1" +version = "5.3.4" description = "Distributed Task Queue." optional = false python-versions = ">=3.8" files = [ - {file = "celery-5.3.1-py3-none-any.whl", hash = "sha256:27f8f3f3b58de6e0ab4f174791383bbd7445aff0471a43e99cfd77727940753f"}, - {file = "celery-5.3.1.tar.gz", hash = "sha256:f84d1c21a1520c116c2b7d26593926581191435a03aa74b77c941b93ca1c6210"}, + {file = "celery-5.3.4-py3-none-any.whl", hash = "sha256:1e6ed40af72695464ce98ca2c201ad0ef8fd192246f6c9eac8bba343b980ad34"}, + {file = "celery-5.3.4.tar.gz", hash = "sha256:9023df6a8962da79eb30c0c84d5f4863d9793a466354cc931d7f72423996de28"}, ] [package.dependencies] @@ -567,14 +567,14 @@ click = ">=8.1.2,<9.0" click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -kombu = ">=5.3.1,<6.0" +kombu = ">=5.3.2,<6.0" python-dateutil = ">=2.8.2" tzdata = ">=2022.7" vine = ">=5.0.0,<6.0" [package.extras] -arangodb = ["pyArango (>=2.0.1)"] -auth = ["cryptography (==41.0.1)"] +arangodb = ["pyArango (>=2.0.2)"] +auth = ["cryptography (==41.0.3)"] azureblockblob = ["azure-storage-blob (>=12.15.0)"] brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] cassandra = ["cassandra-driver (>=3.25.0,<4)"] @@ -594,7 +594,7 @@ msgpack = ["msgpack (==1.0.5)"] pymemcache = ["python-memcached (==1.59)"] pyro = ["pyro4 (==4.82)"] pytest = ["pytest-celery (==0.0.0)"] -redis = ["redis (>=4.5.2,!=4.5.5)"] +redis = ["redis (>=4.5.2,!=4.5.5,<5.0.0)"] s3 = ["boto3 (>=1.26.143)"] slmq = ["softlayer-messaging (>=1.0.3)"] solar = ["ephem (==4.1.4)"] @@ -819,13 +819,13 @@ files = [ [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -921,63 +921,63 @@ files = [ [[package]] name = "coverage" -version = "7.3.0" +version = "7.3.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, - {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, - {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, - {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, - {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, - {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, - {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, - {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, - {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, - {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, - {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, - {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, - {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, - {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, + {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, + {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, + {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, + {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, + {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, + {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, + {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, + {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, + {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, + {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, + {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, + {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, ] [package.extras] @@ -1062,29 +1062,29 @@ tests = ["django", "hypothesis", "pytest", "pytest-asyncio"] [[package]] name = "debugpy" -version = "1.6.7.post1" +version = "1.8.0" description = "An implementation of the Debug Adapter Protocol for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, - {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, - {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, ] [[package]] @@ -1125,13 +1125,13 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "django" -version = "4.2.4" +version = "4.2.5" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" files = [ - {file = "Django-4.2.4-py3-none-any.whl", hash = "sha256:860ae6a138a238fc4f22c99b52f3ead982bb4b1aad8c0122bcd8c8a3a02e409d"}, - {file = "Django-4.2.4.tar.gz", hash = "sha256:7e4225ec065e0f354ccf7349a22d209de09cc1c074832be9eb84c51c1799c432"}, + {file = "Django-4.2.5-py3-none-any.whl", hash = "sha256:b6b2b5cae821077f137dc4dade696a1c2aa292f892eca28fa8d7bfdf2608ddd4"}, + {file = "Django-4.2.5.tar.gz", hash = "sha256:5e5c1c9548ffb7796b4a8a4782e9a2e5a3df3615259fc1bfd3ebc73b646146c1"}, ] [package.dependencies] @@ -1145,13 +1145,13 @@ bcrypt = ["bcrypt"] [[package]] name = "django-filter" -version = "23.2" +version = "23.3" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." optional = false python-versions = ">=3.7" files = [ - {file = "django-filter-23.2.tar.gz", hash = "sha256:2fe15f78108475eda525692813205fa6f9e8c1caf1ae65daa5862d403c6dbf00"}, - {file = "django_filter-23.2-py3-none-any.whl", hash = "sha256:d12d8e0fc6d3eb26641e553e5d53b191eb8cec611427d4bdce0becb1f7c172b5"}, + {file = "django-filter-23.3.tar.gz", hash = "sha256:015fe155582e1805b40629344e4a6cf3cc40450827d294d040b4b8c1749a9fa6"}, + {file = "django_filter-23.3-py3-none-any.whl", hash = "sha256:65bc5d1d8f4fff3aaf74cb5da537b6620e9214fb4b3180f6c560776b1b6dccd0"}, ] [package.dependencies] @@ -1185,23 +1185,6 @@ files = [ [package.dependencies] Django = ">=3.2" -[[package]] -name = "django-otp" -version = "1.2.2" -description = "A pluggable framework for adding two-factor authentication to Django using one-time passwords." -optional = false -python-versions = ">=3.7" -files = [ - {file = "django_otp-1.2.2-py3-none-any.whl", hash = "sha256:90765d5dac238a719f9550ac05681dd6307f513a81a10b6adb879b4abc6bc1a3"}, - {file = "django_otp-1.2.2.tar.gz", hash = "sha256:007a6354dabb3a1a54574bf73abf045ebbde0bb8734a38e2ed7845ba450f345e"}, -] - -[package.dependencies] -django = ">=3.2" - -[package.extras] -qrcode = ["qrcode"] - [[package]] name = "django-prometheus" version = "2.3.1" @@ -1284,13 +1267,13 @@ djangorestframework = "*" [[package]] name = "dnspython" -version = "2.4.1" +version = "2.4.2" description = "DNS toolkit" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "dnspython-2.4.1-py3-none-any.whl", hash = "sha256:5b7488477388b8c0b70a8ce93b227c5603bc7b77f1565afe8e729c36c51447d7"}, - {file = "dnspython-2.4.1.tar.gz", hash = "sha256:c33971c79af5be968bb897e95c2448e11a645ee84d93b265ce0b7aabe5dfdca8"}, + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, ] [package.extras] @@ -1414,13 +1397,13 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -1458,6 +1441,20 @@ prometheus-client = ">=0.8.0" pytz = "*" tornado = ">=5.0.0,<7.0.0" +[[package]] +name = "freezegun" +version = "1.2.2" +description = "Let your Python tests travel through time" +optional = false +python-versions = ">=3.6" +files = [ + {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, + {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, +] + +[package.dependencies] +python-dateutil = ">=2.7" + [[package]] name = "frozenlist" version = "1.4.0" @@ -1560,13 +1557,13 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.32" +version = "3.1.35" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.32-py3-none-any.whl", hash = "sha256:e3d59b1c2c6ebb9dfa7a184daf3b6dd4914237e7488a1730a6d8f6f5d0b4187f"}, - {file = "GitPython-3.1.32.tar.gz", hash = "sha256:8d9b8cb1e80b9735e8717c9362079d3ce4c6e5ddeebedd0361b228c3a67a62f6"}, + {file = "GitPython-3.1.35-py3-none-any.whl", hash = "sha256:c19b4292d7a1d3c0f653858db273ff8a6614100d1eb1528b014ec97286193c09"}, + {file = "GitPython-3.1.35.tar.gz", hash = "sha256:9cbefbd1789a5fe9bcf621bb34d3f441f3a90c8461d377f84eda73e721d9b06b"}, ] [package.dependencies] @@ -1687,13 +1684,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "humanize" -version = "4.7.0" +version = "4.8.0" description = "Python humanize utilities" optional = false python-versions = ">=3.8" files = [ - {file = "humanize-4.7.0-py3-none-any.whl", hash = "sha256:df7c429c2d27372b249d3f26eb53b07b166b661326e0325793e0a988082e3889"}, - {file = "humanize-4.7.0.tar.gz", hash = "sha256:7ca0e43e870981fa684acb5b062deb307218193bca1a01f2b2676479df849b3a"}, + {file = "humanize-4.8.0-py3-none-any.whl", hash = "sha256:8bc9e2bb9315e61ec06bf690151ae35aeb65651ab091266941edf97c90836404"}, + {file = "humanize-4.8.0.tar.gz", hash = "sha256:9783373bf1eec713a770ecaa7c2d7a7902c98398009dfa3d8a2df91eec9311e8"}, ] [package.extras] @@ -1841,13 +1838,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.18.4" +version = "4.19.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, - {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, + {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, + {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, ] [package.dependencies] @@ -1876,13 +1873,13 @@ referencing = ">=0.28.0" [[package]] name = "kombu" -version = "5.3.1" +version = "5.3.2" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.1-py3-none-any.whl", hash = "sha256:48ee589e8833126fd01ceaa08f8a2041334e9f5894e5763c8486a550454551e9"}, - {file = "kombu-5.3.1.tar.gz", hash = "sha256:fbd7572d92c0bf71c112a6b45163153dea5a7b6a701ec16b568c27d0fd2370f2"}, + {file = "kombu-5.3.2-py3-none-any.whl", hash = "sha256:b753c9cfc9b1e976e637a7cbc1a65d446a22e45546cd996ea28f932082b7dc9e"}, + {file = "kombu-5.3.2.tar.gz", hash = "sha256:0ba213f630a2cb2772728aef56ac6883dc3a2f13435e10048f6e97d48506dbbd"}, ] [package.dependencies] @@ -2149,6 +2146,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2486,13 +2493,13 @@ files = [ [[package]] name = "pdoc" -version = "14.0.0" +version = "14.1.0" description = "API Documentation for Python Projects" optional = false python-versions = ">=3.8" files = [ - {file = "pdoc-14.0.0-py3-none-any.whl", hash = "sha256:4514041ff5da33f1adbc700002a661600fc13a9adadef317bc6ae8be9e61154b"}, - {file = "pdoc-14.0.0.tar.gz", hash = "sha256:ad6c16c949e5dd8b30effc5398aedb5779ffe8ab94be91ce2cddc320e8127900"}, + {file = "pdoc-14.1.0-py3-none-any.whl", hash = "sha256:e8869dffe21296b3bd5545b28e7f07cae0656082aca43f8915323187e541b126"}, + {file = "pdoc-14.1.0.tar.gz", hash = "sha256:3a0bd921a05c39a82b1505089eb6dc99d857b71b856aa60d1aca4d9086d0e18c"}, ] [package.dependencies] @@ -2520,13 +2527,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "pluggy" -version = "1.2.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] @@ -2644,43 +2651,43 @@ files = [ [[package]] name = "pycryptodome" -version = "3.18.0" +version = "3.19.0" description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodome-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win32.whl", hash = "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380"}, - {file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3006c44c4946583b6de24fe0632091c2653d6256b99a02a3db71ca06472ea1e4"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c760c8a0479a4042111a8dd2f067d3ae4573da286c53f13cf6f5c53a5c1f631"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:08ce3558af5106c632baf6d331d261f02367a6bc3733086ae43c0f988fe042db"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45430dfaf1f421cf462c0dd824984378bef32b22669f2635cb809357dbaab405"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:a9bcd5f3794879e91970f2bbd7d899780541d3ff439d8f2112441769c9f2ccea"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win32.whl", hash = "sha256:190c53f51e988dceb60472baddce3f289fa52b0ec38fbe5fd20dd1d0f795c551"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win_amd64.whl", hash = "sha256:22e0ae7c3a7f87dcdcf302db06ab76f20e83f09a6993c160b248d58274473bfa"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7822f36d683f9ad7bc2145b2c2045014afdbbd1d9922a6d4ce1cbd6add79a01e"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:05e33267394aad6db6595c0ce9d427fe21552f5425e116a925455e099fdf759a"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:829b813b8ee00d9c8aba417621b94bc0b5efd18c928923802ad5ba4cf1ec709c"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:fc7a79590e2b5d08530175823a242de6790abc73638cc6dc9d2684e7be2f5e49"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:542f99d5026ac5f0ef391ba0602f3d11beef8e65aae135fa5b762f5ebd9d3bfb"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:61bb3ccbf4bf32ad9af32da8badc24e888ae5231c617947e0f5401077f8b091f"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d49a6c715d8cceffedabb6adb7e0cbf41ae1a2ff4adaeec9432074a80627dea1"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e249a784cc98a29c77cea9df54284a44b40cafbfae57636dd2f8775b48af2434"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d033947e7fd3e2ba9a031cb2d267251620964705a013c5a461fa5233cc025270"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:84c3e4fffad0c4988aef0d5591be3cad4e10aa7db264c65fadbc633318d20bde"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:139ae2c6161b9dd5d829c9645d781509a810ef50ea8b657e2257c25ca20efe33"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5b1986c761258a5b4332a7f94a83f631c1ffca8747d75ab8395bf2e1b93283d9"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win32.whl", hash = "sha256:536f676963662603f1f2e6ab01080c54d8cd20f34ec333dcb195306fa7826997"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win_amd64.whl", hash = "sha256:04dd31d3b33a6b22ac4d432b3274588917dcf850cc0c51c84eca1d8ed6933810"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:8999316e57abcbd8085c91bc0ef75292c8618f41ca6d2b6132250a863a77d1e7"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-win32.whl", hash = "sha256:a0ab84755f4539db086db9ba9e9f3868d2e3610a3948cbd2a55e332ad83b01b0"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0101f647d11a1aae5a8ce4f5fad6644ae1b22bb65d05accc7d322943c69a74a6"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1601e04d32087591d78e0b81e1e520e57a92796089864b20e5f18c9564b3fa"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:506c686a1eee6c00df70010be3b8e9e78f406af4f21b23162bbb6e9bdf5427bc"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7919ccd096584b911f2a303c593280869ce1af9bf5d36214511f5e5a1bed8c34"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560591c0777f74a5da86718f70dfc8d781734cf559773b64072bbdda44b3fc3e"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cc2f2ae451a676def1a73c1ae9120cd31af25db3f381893d45f75e77be2400"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17940dcf274fcae4a54ec6117a9ecfe52907ed5e2e438fe712fe7ca502672ed5"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d04f5f623a280fbd0ab1c1d8ecbd753193ab7154f09b6161b0f857a1a676c15f"}, + {file = "pycryptodome-3.19.0.tar.gz", hash = "sha256:bc35d463222cdb4dbebd35e0784155c81e161b9284e567e7e933d722e533331e"}, ] [[package]] @@ -2840,13 +2847,13 @@ pydantic = [ [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -2999,13 +3006,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] [package.dependencies] @@ -3186,13 +3193,13 @@ files = [ [[package]] name = "redis" -version = "4.6.0" +version = "5.0.0" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, - {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, + {file = "redis-5.0.0-py3-none-any.whl", hash = "sha256:06570d0b2d84d46c21defc550afbaada381af82f5b83e5b3777600e05d8e2ed0"}, + {file = "redis-5.0.0.tar.gz", hash = "sha256:5cea6c0d335c9a7332a460ed8729ceabb4d0c489c7285b0a86dbbf8a017bd120"}, ] [package.dependencies] @@ -3204,13 +3211,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.30.0" +version = "0.30.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"}, - {file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"}, + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, ] [package.dependencies] @@ -3277,13 +3284,13 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.5.1" +version = "13.5.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.5.1-py3-none-any.whl", hash = "sha256:b97381b204a206e1be618f5e1215a57174a1a7732490b3bf6668cf41d30bc72d"}, - {file = "rich-13.5.1.tar.gz", hash = "sha256:881653ee7037803559d8eae98f145e0a4c4b0ec3ff0300d2cc8d479c71fc6819"}, + {file = "rich-13.5.2-py3-none-any.whl", hash = "sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808"}, + {file = "rich-13.5.2.tar.gz", hash = "sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39"}, ] [package.dependencies] @@ -3295,108 +3302,108 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.9.2" +version = "0.10.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7"}, - {file = "rpds_py-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29cd8bfb2d716366a035913ced99188a79b623a3512292963d84d3e06e63b496"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44659b1f326214950a8204a248ca6199535e73a694be8d3e0e869f820767f12f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:745f5a43fdd7d6d25a53ab1a99979e7f8ea419dfefebcab0a5a1e9095490ee5e"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a987578ac5214f18b99d1f2a3851cba5b09f4a689818a106c23dbad0dfeb760f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf4151acb541b6e895354f6ff9ac06995ad9e4175cbc6d30aaed08856558201f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03421628f0dc10a4119d714a17f646e2837126a25ac7a256bdf7c3943400f67f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13b602dc3e8dff3063734f02dcf05111e887f301fdda74151a93dbbc249930fe"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fae5cb554b604b3f9e2c608241b5d8d303e410d7dfb6d397c335f983495ce7f6"}, - {file = "rpds_py-0.9.2-cp310-none-win32.whl", hash = "sha256:47c5f58a8e0c2c920cc7783113df2fc4ff12bf3a411d985012f145e9242a2764"}, - {file = "rpds_py-0.9.2-cp310-none-win_amd64.whl", hash = "sha256:4ea6b73c22d8182dff91155af018b11aac9ff7eca085750455c5990cb1cfae6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e564d2238512c5ef5e9d79338ab77f1cbbda6c2d541ad41b2af445fb200385e3"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f411330a6376fb50e5b7a3e66894e4a39e60ca2e17dce258d53768fea06a37bd"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e7521f5af0233e89939ad626b15278c71b69dc1dfccaa7b97bd4cdf96536bb7"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3335c03100a073883857e91db9f2e0ef8a1cf42dc0369cbb9151c149dbbc1b"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d25b1c1096ef0447355f7293fbe9ad740f7c47ae032c2884113f8e87660d8f6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a5d3fbd02efd9cf6a8ffc2f17b53a33542f6b154e88dd7b42ef4a4c0700fdad"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5934e2833afeaf36bd1eadb57256239785f5af0220ed8d21c2896ec4d3a765f"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:095b460e117685867d45548fbd8598a8d9999227e9061ee7f012d9d264e6048d"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91378d9f4151adc223d584489591dbb79f78814c0734a7c3bfa9c9e09978121c"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:24a81c177379300220e907e9b864107614b144f6c2a15ed5c3450e19cf536fae"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de0b6eceb46141984671802d412568d22c6bacc9b230174f9e55fc72ef4f57de"}, - {file = "rpds_py-0.9.2-cp311-none-win32.whl", hash = "sha256:700375326ed641f3d9d32060a91513ad668bcb7e2cffb18415c399acb25de2ab"}, - {file = "rpds_py-0.9.2-cp311-none-win_amd64.whl", hash = "sha256:0766babfcf941db8607bdaf82569ec38107dbb03c7f0b72604a0b346b6eb3298"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1440c291db3f98a914e1afd9d6541e8fc60b4c3aab1a9008d03da4651e67386"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0f2996fbac8e0b77fd67102becb9229986396e051f33dbceada3debaacc7033f"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f30d205755566a25f2ae0382944fcae2f350500ae4df4e795efa9e850821d82"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:159fba751a1e6b1c69244e23ba6c28f879a8758a3e992ed056d86d74a194a0f3"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1f044792e1adcea82468a72310c66a7f08728d72a244730d14880cd1dabe36b"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9251eb8aa82e6cf88510530b29eef4fac825a2b709baf5b94a6094894f252387"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01899794b654e616c8625b194ddd1e5b51ef5b60ed61baa7a2d9c2ad7b2a4238"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0c43f8ae8f6be1d605b0465671124aa8d6a0e40f1fb81dcea28b7e3d87ca1e1"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:207f57c402d1f8712618f737356e4b6f35253b6d20a324d9a47cb9f38ee43a6b"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b52e7c5ae35b00566d244ffefba0f46bb6bec749a50412acf42b1c3f402e2c90"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:978fa96dbb005d599ec4fd9ed301b1cc45f1a8f7982d4793faf20b404b56677d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6aa8326a4a608e1c28da191edd7c924dff445251b94653988efb059b16577a4d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aad51239bee6bff6823bbbdc8ad85136c6125542bbc609e035ab98ca1e32a192"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd4dc3602370679c2dfb818d9c97b1137d4dd412230cfecd3c66a1bf388a196"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd9da77c6ec1f258387957b754f0df60766ac23ed698b61941ba9acccd3284d1"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:190ca6f55042ea4649ed19c9093a9be9d63cd8a97880106747d7147f88a49d18"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:876bf9ed62323bc7dcfc261dbc5572c996ef26fe6406b0ff985cbcf460fc8a4c"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2818759aba55df50592ecbc95ebcdc99917fa7b55cc6796235b04193eb3c55"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ea4d00850ef1e917815e59b078ecb338f6a8efda23369677c54a5825dbebb55"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5855c85eb8b8a968a74dc7fb014c9166a05e7e7a8377fb91d78512900aadd13d"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:14c408e9d1a80dcb45c05a5149e5961aadb912fff42ca1dd9b68c0044904eb32"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:65a0583c43d9f22cb2130c7b110e695fff834fd5e832a776a107197e59a1898e"}, - {file = "rpds_py-0.9.2-cp38-none-win32.whl", hash = "sha256:71f2f7715935a61fa3e4ae91d91b67e571aeb5cb5d10331ab681256bda2ad920"}, - {file = "rpds_py-0.9.2-cp38-none-win_amd64.whl", hash = "sha256:674c704605092e3ebbbd13687b09c9f78c362a4bc710343efe37a91457123044"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:07e2c54bef6838fa44c48dfbc8234e8e2466d851124b551fc4e07a1cfeb37260"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fdf55283ad38c33e35e2855565361f4bf0abd02470b8ab28d499c663bc5d7c"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:890ba852c16ace6ed9f90e8670f2c1c178d96510a21b06d2fa12d8783a905193"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50025635ba8b629a86d9d5474e650da304cb46bbb4d18690532dd79341467846"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517cbf6e67ae3623c5127206489d69eb2bdb27239a3c3cc559350ef52a3bbf0b"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0836d71ca19071090d524739420a61580f3f894618d10b666cf3d9a1688355b1"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c439fd54b2b9053717cca3de9583be6584b384d88d045f97d409f0ca867d80f"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f68996a3b3dc9335037f82754f9cdbe3a95db42bde571d8c3be26cc6245f2324"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7d68dc8acded354c972116f59b5eb2e5864432948e098c19fe6994926d8e15c3"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f963c6b1218b96db85fc37a9f0851eaf8b9040aa46dec112611697a7023da535"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a46859d7f947061b4010e554ccd1791467d1b1759f2dc2ec9055fa239f1bc26"}, - {file = "rpds_py-0.9.2-cp39-none-win32.whl", hash = "sha256:e07e5dbf8a83c66783a9fe2d4566968ea8c161199680e8ad38d53e075df5f0d0"}, - {file = "rpds_py-0.9.2-cp39-none-win_amd64.whl", hash = "sha256:682726178138ea45a0766907957b60f3a1bf3acdf212436be9733f28b6c5af3c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:196cb208825a8b9c8fc360dc0f87993b8b260038615230242bf18ec84447c08d"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c7671d45530fcb6d5e22fd40c97e1e1e01965fc298cbda523bb640f3d923b387"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83b32f0940adec65099f3b1c215ef7f1d025d13ff947975a055989cb7fd019a4"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f67da97f5b9eac838b6980fc6da268622e91f8960e083a34533ca710bec8611"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03975db5f103997904c37e804e5f340c8fdabbb5883f26ee50a255d664eed58c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:987b06d1cdb28f88a42e4fb8a87f094e43f3c435ed8e486533aea0bf2e53d931"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c861a7e4aef15ff91233751619ce3a3d2b9e5877e0fcd76f9ea4f6847183aa16"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02938432352359805b6da099c9c95c8a0547fe4b274ce8f1a91677401bb9a45f"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ef1f08f2a924837e112cba2953e15aacfccbbfcd773b4b9b4723f8f2ddded08e"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:35da5cc5cb37c04c4ee03128ad59b8c3941a1e5cd398d78c37f716f32a9b7f67"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:141acb9d4ccc04e704e5992d35472f78c35af047fa0cfae2923835d153f091be"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79f594919d2c1a0cc17d1988a6adaf9a2f000d2e1048f71f298b056b1018e872"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a06418fe1155e72e16dddc68bb3780ae44cebb2912fbd8bb6ff9161de56e1798"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b2eb034c94b0b96d5eddb290b7b5198460e2d5d0c421751713953a9c4e47d10"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b08605d248b974eb02f40bdcd1a35d3924c83a2a5e8f5d0fa5af852c4d960af"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0805911caedfe2736935250be5008b261f10a729a303f676d3d5fea6900c96a"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab2299e3f92aa5417d5e16bb45bb4586171c1327568f638e8453c9f8d9e0f020"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c8d7594e38cf98d8a7df25b440f684b510cf4627fe038c297a87496d10a174f"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b9ec12ad5f0a4625db34db7e0005be2632c1013b253a4a60e8302ad4d462afd"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1fcdee18fea97238ed17ab6478c66b2095e4ae7177e35fb71fbe561a27adf620"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:933a7d5cd4b84f959aedeb84f2030f0a01d63ae6cf256629af3081cf3e3426e8"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:686ba516e02db6d6f8c279d1641f7067ebb5dc58b1d0536c4aaebb7bf01cdc5d"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0173c0444bec0a3d7d848eaeca2d8bd32a1b43f3d3fde6617aac3731fa4be05f"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d576c3ef8c7b2d560e301eb33891d1944d965a4d7a2eacb6332eee8a71827db6"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed89861ee8c8c47d6beb742a602f912b1bb64f598b1e2f3d758948721d44d468"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1054a08e818f8e18910f1bee731583fe8f899b0a0a5044c6e680ceea34f93876"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99e7c4bb27ff1aab90dcc3e9d37ee5af0231ed98d99cb6f5250de28889a3d502"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c545d9d14d47be716495076b659db179206e3fd997769bc01e2d550eeb685596"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9039a11bca3c41be5a58282ed81ae422fa680409022b996032a43badef2a3752"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fb39aca7a64ad0c9490adfa719dbeeb87d13be137ca189d2564e596f8ba32c07"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2d8b3b3a2ce0eaa00c5bbbb60b6713e94e7e0becab7b3db6c5c77f979e8ed1f1"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:99b1c16f732b3a9971406fbfe18468592c5a3529585a45a35adbc1389a529a03"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe"}, - {file = "rpds_py-0.9.2.tar.gz", hash = "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945"}, + {file = "rpds_py-0.10.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:c1e0e9916301e3b3d970814b1439ca59487f0616d30f36a44cead66ee1748c31"}, + {file = "rpds_py-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ce8caa29ebbdcde67e5fd652c811d34bc01f249dbc0d61e5cc4db05ae79a83b"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad277f74b1c164f7248afa968700e410651eb858d7c160d109fb451dc45a2f09"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e1c68303ccf7fceb50fbab79064a2636119fd9aca121f28453709283dbca727"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:780fcb855be29153901c67fc9c5633d48aebef21b90aa72812fa181d731c6b00"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbd7b24d108509a1b9b6679fcc1166a7dd031dbef1f3c2c73788f42e3ebb3beb"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0700c2133ba203c4068aaecd6a59bda22e06a5e46255c9da23cbf68c6942215d"}, + {file = "rpds_py-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576da63eae7809f375932bfcbca2cf20620a1915bf2fedce4b9cc8491eceefe3"}, + {file = "rpds_py-0.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23750a9b8a329844ba1fe267ca456bb3184984da2880ed17ae641c5af8de3fef"}, + {file = "rpds_py-0.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d08395595c42bcd82c3608762ce734504c6d025eef1c06f42326a6023a584186"}, + {file = "rpds_py-0.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1d7b7b71bcb82d8713c7c2e9c5f061415598af5938666beded20d81fa23e7640"}, + {file = "rpds_py-0.10.0-cp310-none-win32.whl", hash = "sha256:97f5811df21703446b42303475b8b855ee07d6ab6cdf8565eff115540624f25d"}, + {file = "rpds_py-0.10.0-cp310-none-win_amd64.whl", hash = "sha256:cdbed8f21204398f47de39b0a9b180d7e571f02dfb18bf5f1b618e238454b685"}, + {file = "rpds_py-0.10.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:7a3a3d3e4f1e3cd2a67b93a0b6ed0f2499e33f47cc568e3a0023e405abdc0ff1"}, + {file = "rpds_py-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc72ae476732cdb7b2c1acb5af23b478b8a0d4b6fcf19b90dd150291e0d5b26b"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0583f69522732bdd79dca4cd3873e63a29acf4a299769c7541f2ca1e4dd4bc6"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8b9a7cd381970e64849070aca7c32d53ab7d96c66db6c2ef7aa23c6e803f514"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d292cabd7c8335bdd3237ded442480a249dbcdb4ddfac5218799364a01a0f5c"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6903cdca64f1e301af9be424798328c1fe3b4b14aede35f04510989fc72f012"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bed57543c99249ab3a4586ddc8786529fbc33309e5e8a1351802a06ca2baf4c2"}, + {file = "rpds_py-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15932ec5f224b0e35764dc156514533a4fca52dcfda0dfbe462a1a22b37efd59"}, + {file = "rpds_py-0.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb2d59bc196e6d3b1827c7db06c1a898bfa0787c0574af398e65ccf2e97c0fbe"}, + {file = "rpds_py-0.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f99d74ddf9d3b6126b509e81865f89bd1283e3fc1b568b68cd7bd9dfa15583d7"}, + {file = "rpds_py-0.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f70bec8a14a692be6dbe7ce8aab303e88df891cbd4a39af091f90b6702e28055"}, + {file = "rpds_py-0.10.0-cp311-none-win32.whl", hash = "sha256:5f7487be65b9c2c510819e744e375bd41b929a97e5915c4852a82fbb085df62c"}, + {file = "rpds_py-0.10.0-cp311-none-win_amd64.whl", hash = "sha256:748e472345c3a82cfb462d0dff998a7bf43e621eed73374cb19f307e97e08a83"}, + {file = "rpds_py-0.10.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:d4639111e73997567343df6551da9dd90d66aece1b9fc26c786d328439488103"}, + {file = "rpds_py-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f4760e1b02173f4155203054f77a5dc0b4078de7645c922b208d28e7eb99f3e2"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6420a36975e0073acaeee44ead260c1f6ea56812cfc6c31ec00c1c48197173"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58fc4d66ee349a23dbf08c7e964120dc9027059566e29cf0ce6205d590ed7eca"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:063411228b852fb2ed7485cf91f8e7d30893e69b0acb207ec349db04cccc8225"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65af12f70355de29e1092f319f85a3467f4005e959ab65129cb697169ce94b86"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298e8b5d8087e0330aac211c85428c8761230ef46a1f2c516d6a2f67fb8803c5"}, + {file = "rpds_py-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b9bf77008f2c55dabbd099fd3ac87009471d223a1c7ebea36873d39511b780a"}, + {file = "rpds_py-0.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c7853f27195598e550fe089f78f0732c66ee1d1f0eaae8ad081589a5a2f5d4af"}, + {file = "rpds_py-0.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:75dbfd41a61bc1fb0536bf7b1abf272dc115c53d4d77db770cd65d46d4520882"}, + {file = "rpds_py-0.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b25136212a3d064a8f0b9ebbb6c57094c5229e0de76d15c79b76feff26aeb7b8"}, + {file = "rpds_py-0.10.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:9affee8cb1ec453382c27eb9043378ab32f49cd4bc24a24275f5c39bf186c279"}, + {file = "rpds_py-0.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d55528ef13af4b4e074d067977b1f61408602f53ae4537dccf42ba665c2c7bd"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7865df1fb564092bcf46dac61b5def25342faf6352e4bc0e61a286e3fa26a3d"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f5cc8c7bc99d2bbcd704cef165ca7d155cd6464c86cbda8339026a42d219397"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbae50d352e4717ffc22c566afc2d0da744380e87ed44a144508e3fb9114a3f4"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fccbf0cd3411719e4c9426755df90bf3449d9fc5a89f077f4a7f1abd4f70c910"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d10c431073dc6ebceed35ab22948a016cc2b5120963c13a41e38bdde4a7212"}, + {file = "rpds_py-0.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b401e8b9aece651512e62c431181e6e83048a651698a727ea0eb0699e9f9b74"}, + {file = "rpds_py-0.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7618a082c55cf038eede4a918c1001cc8a4411dfe508dc762659bcd48d8f4c6e"}, + {file = "rpds_py-0.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b3226b246facae14909b465061ddcfa2dfeadb6a64f407f24300d42d69bcb1a1"}, + {file = "rpds_py-0.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a8edd467551c1102dc0f5754ab55cd0703431cd3044edf8c8e7d9208d63fa453"}, + {file = "rpds_py-0.10.0-cp38-none-win32.whl", hash = "sha256:71333c22f7cf5f0480b59a0aef21f652cf9bbaa9679ad261b405b65a57511d1e"}, + {file = "rpds_py-0.10.0-cp38-none-win_amd64.whl", hash = "sha256:a8ab1adf04ae2d6d65835995218fd3f3eb644fe20655ca8ee233e2c7270ff53b"}, + {file = "rpds_py-0.10.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:87c93b25d538c433fb053da6228c6290117ba53ff6a537c133b0f2087948a582"}, + {file = "rpds_py-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7996aed3f65667c6dcc8302a69368435a87c2364079a066750a2eac75ea01e"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8856aa76839dc234d3469f1e270918ce6bec1d6a601eba928f45d68a15f04fc3"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00215f6a9058fbf84f9d47536902558eb61f180a6b2a0fa35338d06ceb9a2e5a"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23a059143c1393015c68936370cce11690f7294731904bdae47cc3e16d0b2474"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e5c26905aa651cc8c0ddc45e0e5dea2a1296f70bdc96af17aee9d0493280a17"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c651847545422c8131660704c58606d841e228ed576c8f1666d98b3d318f89da"}, + {file = "rpds_py-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80992eb20755701753e30a6952a96aa58f353d12a65ad3c9d48a8da5ec4690cf"}, + {file = "rpds_py-0.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ffcf18ad3edf1c170e27e88b10282a2c449aa0358659592462448d71b2000cfc"}, + {file = "rpds_py-0.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08e08ccf5b10badb7d0a5c84829b914c6e1e1f3a716fdb2bf294e2bd01562775"}, + {file = "rpds_py-0.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7150b83b3e3ddaac81a8bb6a9b5f93117674a0e7a2b5a5b32ab31fdfea6df27f"}, + {file = "rpds_py-0.10.0-cp39-none-win32.whl", hash = "sha256:3455ecc46ea443b5f7d9c2f946ce4017745e017b0d0f8b99c92564eff97e97f5"}, + {file = "rpds_py-0.10.0-cp39-none-win_amd64.whl", hash = "sha256:afe6b5a04b2ab1aa89bad32ca47bf71358e7302a06fdfdad857389dca8fb5f04"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b1cb078f54af0abd835ca76f93a3152565b73be0f056264da45117d0adf5e99c"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8e7e2b3577e97fa43c2c2b12a16139b2cedbd0770235d5179c0412b4794efd9b"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae46a50d235f1631d9ec4670503f7b30405103034830bc13df29fd947207f795"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f869e34d2326e417baee430ae998e91412cc8e7fdd83d979277a90a0e79a5b47"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d544a614055b131111bed6edfa1cb0fb082a7265761bcb03321f2dd7b5c6c48"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee9c2f6ca9774c2c24bbf7b23086264e6b5fa178201450535ec0859739e6f78d"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2da4a8c6d465fde36cea7d54bf47b5cf089073452f0e47c8632ecb9dec23c07"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac00c41dd315d147b129976204839ca9de699d83519ff1272afbe4fb9d362d12"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0155c33af0676fc38e1107679be882077680ad1abb6303956b97259c3177e85e"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:db6585b600b2e76e98131e0ac0e5195759082b51687ad0c94505970c90718f4a"}, + {file = "rpds_py-0.10.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:7b6975d3763d0952c111700c0634968419268e6bbc0b55fe71138987fa66f309"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:6388e4e95a26717b94a05ced084e19da4d92aca883f392dffcf8e48c8e221a24"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:18f87baa20e02e9277ad8960cd89b63c79c05caf106f4c959a9595c43f2a34a5"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f05fc7d832e970047662b3440b190d24ea04f8d3c760e33e7163b67308c878"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:291c9ce3929a75b45ce8ddde2aa7694fc8449f2bc8f5bd93adf021efaae2d10b"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:861d25ae0985a1dd5297fee35f476b60c6029e2e6e19847d5b4d0a43a390b696"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:668d2b45d62c68c7a370ac3dce108ffda482b0a0f50abd8b4c604a813a59e08f"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344b89384c250ba6a4ce1786e04d01500e4dac0f4137ceebcaad12973c0ac0b3"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:885e023e73ce09b11b89ab91fc60f35d80878d2c19d6213a32b42ff36543c291"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:841128a22e6ac04070a0f84776d07e9c38c4dcce8e28792a95e45fc621605517"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:899b5e7e2d5a8bc92aa533c2d4e55e5ebba095c485568a5e4bedbc163421259a"}, + {file = "rpds_py-0.10.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e7947d9a6264c727a556541b1630296bbd5d0a05068d21c38dde8e7a1c703ef0"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4992266817169997854f81df7f6db7bdcda1609972d8ffd6919252f09ec3c0f6"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:26d9fd624649a10e4610fab2bc820e215a184d193e47d0be7fe53c1c8f67f370"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0028eb0967942d0d2891eae700ae1a27b7fd18604cfcb16a1ef486a790fee99e"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9e7e493ded7042712a374471203dd43ae3fff5b81e3de1a0513fa241af9fd41"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d68a8e8a3a816629283faf82358d8c93fe5bd974dd2704152394a3de4cec22a"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6d5f061f6a2aa55790b9e64a23dfd87b6664ab56e24cd06c78eb43986cb260b"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c7c4266c1b61eb429e8aeb7d8ed6a3bfe6c890a1788b18dbec090c35c6b93fa"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80772e3bda6787510d9620bc0c7572be404a922f8ccdfd436bf6c3778119464c"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b98e75b21fc2ba5285aef8efaf34131d16af1c38df36bdca2f50634bea2d3060"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:d63787f289944cc4bde518ad2b5e70a4f0d6e2ce76324635359c74c113fd188f"}, + {file = "rpds_py-0.10.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:872f3dcaa8bf2245944861d7311179d2c0c9b2aaa7d3b464d99a7c2e401f01fa"}, + {file = "rpds_py-0.10.0.tar.gz", hash = "sha256:e36d7369363d2707d5f68950a64c4e025991eb0177db01ccb6aa6facae48b69f"}, ] [[package]] @@ -3415,39 +3422,39 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.0.286" +version = "0.0.290" description = "An extremely fast Python linter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.286-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:8e22cb557e7395893490e7f9cfea1073d19a5b1dd337f44fd81359b2767da4e9"}, - {file = "ruff-0.0.286-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:68ed8c99c883ae79a9133cb1a86d7130feee0397fdf5ba385abf2d53e178d3fa"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8301f0bb4ec1a5b29cfaf15b83565136c47abefb771603241af9d6038f8981e8"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acc4598f810bbc465ce0ed84417ac687e392c993a84c7eaf3abf97638701c1ec"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88c8e358b445eb66d47164fa38541cfcc267847d1e7a92dd186dddb1a0a9a17f"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0433683d0c5dbcf6162a4beb2356e820a593243f1fa714072fec15e2e4f4c939"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddb61a0c4454cbe4623f4a07fef03c5ae921fe04fede8d15c6e36703c0a73b07"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47549c7c0be24c8ae9f2bce6f1c49fbafea83bca80142d118306f08ec7414041"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:559aa793149ac23dc4310f94f2c83209eedb16908a0343663be19bec42233d25"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d73cfb1c3352e7aa0ce6fb2321f36fa1d4a2c48d2ceac694cb03611ddf0e4db6"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3dad93b1f973c6d1db4b6a5da8690c5625a3fa32bdf38e543a6936e634b83dc3"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26afc0851f4fc3738afcf30f5f8b8612a31ac3455cb76e611deea80f5c0bf3ce"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9b6b116d1c4000de1b9bf027131dbc3b8a70507788f794c6b09509d28952c512"}, - {file = "ruff-0.0.286-py3-none-win32.whl", hash = "sha256:556e965ac07c1e8c1c2d759ac512e526ecff62c00fde1a046acb088d3cbc1a6c"}, - {file = "ruff-0.0.286-py3-none-win_amd64.whl", hash = "sha256:5d295c758961376c84aaa92d16e643d110be32add7465e197bfdaec5a431a107"}, - {file = "ruff-0.0.286-py3-none-win_arm64.whl", hash = "sha256:1d6142d53ab7f164204b3133d053c4958d4d11ec3a39abf23a40b13b0784e3f0"}, - {file = "ruff-0.0.286.tar.gz", hash = "sha256:f1e9d169cce81a384a26ee5bb8c919fe9ae88255f39a1a69fd1ebab233a85ed2"}, + {file = "ruff-0.0.290-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:0e2b09ac4213b11a3520221083866a5816616f3ae9da123037b8ab275066fbac"}, + {file = "ruff-0.0.290-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4ca6285aa77b3d966be32c9a3cd531655b3d4a0171e1f9bf26d66d0372186767"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35e3550d1d9f2157b0fcc77670f7bb59154f223bff281766e61bdd1dd854e0c5"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d748c8bd97874f5751aed73e8dde379ce32d16338123d07c18b25c9a2796574a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982af5ec67cecd099e2ef5e238650407fb40d56304910102d054c109f390bf3c"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bbd37352cea4ee007c48a44c9bc45a21f7ba70a57edfe46842e346651e2b995a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d9be6351b7889462912e0b8185a260c0219c35dfd920fb490c7f256f1d8313e"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75cdc7fe32dcf33b7cec306707552dda54632ac29402775b9e212a3c16aad5e6"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb07f37f7aecdbbc91d759c0c09870ce0fb3eed4025eebedf9c4b98c69abd527"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2ab41bc0ba359d3f715fc7b705bdeef19c0461351306b70a4e247f836b9350ed"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:150bf8050214cea5b990945b66433bf9a5e0cef395c9bc0f50569e7de7540c86"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_i686.whl", hash = "sha256:75386ebc15fe5467248c039f5bf6a0cfe7bfc619ffbb8cd62406cd8811815fca"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ac93eadf07bc4ab4c48d8bb4e427bf0f58f3a9c578862eb85d99d704669f5da0"}, + {file = "ruff-0.0.290-py3-none-win32.whl", hash = "sha256:461fbd1fb9ca806d4e3d5c745a30e185f7cf3ca77293cdc17abb2f2a990ad3f7"}, + {file = "ruff-0.0.290-py3-none-win_amd64.whl", hash = "sha256:f1f49f5ec967fd5778813780b12a5650ab0ebcb9ddcca28d642c689b36920796"}, + {file = "ruff-0.0.290-py3-none-win_arm64.whl", hash = "sha256:ae5a92dfbdf1f0c689433c223f8dac0782c2b2584bd502dfdbc76475669f1ba1"}, + {file = "ruff-0.0.290.tar.gz", hash = "sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d"}, ] [[package]] name = "selenium" -version = "4.11.2" +version = "4.12.0" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "selenium-4.11.2-py3-none-any.whl", hash = "sha256:98e72117b194b3fa9c69b48998f44bf7dd4152c7bd98544911a1753b9f03cc7d"}, - {file = "selenium-4.11.2.tar.gz", hash = "sha256:9f9a5ed586280a3594f7461eb1d9dab3eac9d91e28572f365e9b98d9d03e02b5"}, + {file = "selenium-4.12.0-py3-none-any.whl", hash = "sha256:b2c48b1440db54a0653300d9955f5421390723d53b36ec835e18de8e13bbd401"}, + {file = "selenium-4.12.0.tar.gz", hash = "sha256:95be6aa449a0ab4ac1198bb9de71bbe9170405e04b9752f4b450dc7292a21828"}, ] [package.dependencies] @@ -3458,13 +3465,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} [[package]] name = "sentry-sdk" -version = "1.30.0" +version = "1.31.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.30.0.tar.gz", hash = "sha256:7dc873b87e1faf4d00614afd1058bfa1522942f33daef8a59f90de8ed75cd10c"}, - {file = "sentry_sdk-1.30.0-py2.py3-none-any.whl", hash = "sha256:2e53ad63f96bb9da6570ba2e755c267e529edcf58580a2c0d2a11ef26e1e678b"}, + {file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, + {file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, ] [package.dependencies] @@ -3474,10 +3481,12 @@ urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] @@ -3525,18 +3534,18 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "68.0.0" +version = "68.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -3714,13 +3723,13 @@ wsproto = ">=0.14" [[package]] name = "twilio" -version = "8.7.0" +version = "8.8.0" description = "Twilio API client and TwiML generator" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-8.7.0-py2.py3-none-any.whl", hash = "sha256:0e8db896c8a2adefa0c1f8e725443e0da928db1de02a40687782e5f704738f98"}, - {file = "twilio-8.7.0.tar.gz", hash = "sha256:ffc38ccf05cffe050670f211e872c5d8bfcad420f2ea3dcb361cb42e228b27fa"}, + {file = "twilio-8.8.0-py2.py3-none-any.whl", hash = "sha256:f7a4446e9a0f1ab3e4be99ebdffe114e06ad16b9bf3f7ce582d64a041a871eb4"}, + {file = "twilio-8.8.0.tar.gz", hash = "sha256:ff36612e1139a378c05f713a4efeb09904e968641d287fbeeff2beff2d2c3624"}, ] [package.dependencies] @@ -3772,27 +3781,30 @@ windows-platform = ["pywin32 (!=226)", "pywin32 (!=226)", "twisted[all-non-platf [[package]] name = "twisted-iocpsupport" -version = "1.0.3" +version = "1.0.4" description = "An extension for use in the twisted I/O Completion Ports reactor." optional = false python-versions = "*" files = [ - {file = "twisted-iocpsupport-1.0.3.tar.gz", hash = "sha256:afb00801fdfbaccf0d0173a722626500023d4a19719ac9f129d1347a32e2fc66"}, - {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win32.whl", hash = "sha256:a379ef56a576c8090889f74441bc3822ca31ac82253cc61e8d50631bcb0c26d0"}, - {file = "twisted_iocpsupport-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1ea2c3fbdb739c95cc8b3355305cd593d2c9ec56d709207aa1a05d4d98671e85"}, - {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win32.whl", hash = "sha256:7efcdfafb377f32db90f42bd5fc5bb32cd1e3637ee936cdaf3aff4f4786ab3bf"}, - {file = "twisted_iocpsupport-1.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1dbfac706972bf9ec5ce1ddbc735d2ebba406ad363345df8751ffd5252aa1618"}, - {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:1ddfc5fa22ec6f913464b736b3f46e642237f17ac41be47eed6fa9bd52f5d0e0"}, - {file = "twisted_iocpsupport-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:1bdccbb22199fc69fd7744d6d2dfd22d073c028c8611d994b41d2d2ad0e0f40d"}, - {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:db11c80054b52dbdea44d63d5474a44c9a6531882f0e2960268b15123088641a"}, - {file = "twisted_iocpsupport-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:67bec1716eb8f466ef366bbf262e1467ecc9e20940111207663ac24049785bad"}, - {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win32.whl", hash = "sha256:98a6f16ab215f8c1446e9fc60aaed0ab7c746d566aa2f3492a23cea334e6bebb"}, - {file = "twisted_iocpsupport-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:4f249d0baac836bb431d6fa0178be063a310136bc489465a831e3abd2d7acafd"}, - {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win32.whl", hash = "sha256:aaca8f30c3b7c80d27a33fe9fe0d0bac42b1b012ddc60f677175c30e1becc1f3"}, - {file = "twisted_iocpsupport-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:dff43136c33665c2d117a73706aef6f7d6433e5c4560332a118fe066b16b8695"}, - {file = "twisted_iocpsupport-1.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8faceae553cfadc42ad791b1790e7cdecb7751102608c405217f6a26e877e0c5"}, - {file = "twisted_iocpsupport-1.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6f8c433faaad5d53d30d1da6968d5a3730df415e2efb6864847267a9b51290cd"}, - {file = "twisted_iocpsupport-1.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3f39c41c0213a81a9ce0961e30d0d7650f371ad80f8d261007d15a2deb6d5be3"}, + {file = "twisted-iocpsupport-1.0.4.tar.gz", hash = "sha256:858096c0d15e33f15ac157f455d8f86f2f2cdd223963e58c0f682a3af8362d89"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win32.whl", hash = "sha256:afa2b630797f9ed2f27f3d9f55e3f72b4244911e45a8c82756f44babbf0b243e"}, + {file = "twisted_iocpsupport-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:0058c963c8957bcd3deda62122e89953c9de1e867a274facc9b15dde1a9f31e8"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win32.whl", hash = "sha256:196f7c7ccad4ba4d1783b1c4e1d1b22d93c04275cd780bf7498d16c77319ad6e"}, + {file = "twisted_iocpsupport-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:4e5f97bcbabdd79cbaa969b63439b89801ea560f11d42b0a387634275c633623"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win32.whl", hash = "sha256:6081bd7c2f4fcf9b383dcdb3b3385d75a26a7c9d2be25b6950c3d8ea652d2d2d"}, + {file = "twisted_iocpsupport-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:76f7e67cec1f1d097d1f4ed7de41be3d74546e1a4ede0c7d56e775c4dce5dfb0"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:3d306fc4d88a6bcf61ce9d572c738b918578121bfd72891625fab314549024b5"}, + {file = "twisted_iocpsupport-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:391ac4d6002a80e15f35adc4ad6056f4fe1c17ceb0d1f98ba01b0f4f917adfd7"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:0c1b5cf37f0b2d96cc3c9bc86fff16613b9f5d0ca565c96cf1f1fb8cfca4b81c"}, + {file = "twisted_iocpsupport-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3c5dc11d72519e55f727320e3cee535feedfaee09c0f0765ed1ca7badff1ab3c"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win32.whl", hash = "sha256:cc86c2ef598c15d824a243c2541c29459881c67fc3c0adb6efe2242f8f0ec3af"}, + {file = "twisted_iocpsupport-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c27985e949b9b1a1fb4c20c71d315c10ea0f93fdf3ccdd4a8c158b5926edd8c8"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win32.whl", hash = "sha256:e311dfcb470696e3c077249615893cada598e62fa7c4e4ca090167bd2b7d331f"}, + {file = "twisted_iocpsupport-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4574eef1f3bb81501fb02f911298af3c02fe8179c31a33b361dd49180c3e644d"}, + {file = "twisted_iocpsupport-1.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:872747a3b64e2909aee59c803ccd0bceb9b75bf27915520ebd32d69687040fa2"}, + {file = "twisted_iocpsupport-1.0.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c2712b778bacf1db434e3e065adfed3db300754186a29aecac1efae9ef4bcaff"}, + {file = "twisted_iocpsupport-1.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7c66fa0aa4236b27b3c61cb488662d85dae746a6d1c7b0d91cf7aae118445adf"}, + {file = "twisted_iocpsupport-1.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:300437af17396a945a58dcfffd77863303a8b6d9e65c6e81f1d2eed55b50d444"}, ] [[package]] @@ -4012,33 +4024,33 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "watchfiles" -version = "0.19.0" +version = "0.20.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.7" files = [ - {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, - {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, - {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, - {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9"}, + {file = "watchfiles-0.20.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95"}, + {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db"}, + {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164"}, + {file = "watchfiles-0.20.0-cp37-abi3-win32.whl", hash = "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_amd64.whl", hash = "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3"}, + {file = "watchfiles-0.20.0-cp37-abi3-win_arm64.whl", hash = "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193"}, + {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0"}, + {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce"}, + {file = "watchfiles-0.20.0.tar.gz", hash = "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019"}, ] [package.dependencies] @@ -4075,17 +4087,17 @@ pyOpenSSL = ">=23.2.0" [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.6.2" description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket-client-1.6.2.tar.gz", hash = "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa"}, + {file = "websocket_client-1.6.2-py3-none-any.whl", hash = "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] @@ -4453,4 +4465,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "8604e4dac9b0dcc55daccab83d4c182981d21201ef9901cf9c1acdc24288f979" +content-hash = "e6b1df989cb5c50609540c1229d05d8458ef1cc343fb5868402db8b7679ad73c" diff --git a/proxy.Dockerfile b/proxy.Dockerfile index 3043031f9..b98396ac8 100644 --- a/proxy.Dockerfile +++ b/proxy.Dockerfile @@ -1,21 +1,35 @@ # Stage 1: Build website -FROM --platform=${BUILDPLATFORM} docker.io/node:20 as web-builder - -COPY ./web /static/ +FROM --platform=${BUILDPLATFORM} docker.io/node:20.5 as web-builder ENV NODE_ENV=production WORKDIR /static -RUN npm ci --include=dev && npm run build-proxy + +COPY web/package.json . +COPY web/package-lock.json . +RUN --mount=type=bind,target=/static/package.json,src=./web/package.json \ + --mount=type=bind,target=/static/package-lock.json,src=./web/package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci --include=dev + +COPY web . +RUN npm run build-proxy # Stage 2: Build -FROM docker.io/golang:1.21.0-bookworm AS builder +FROM docker.io/golang:1.21.1-bookworm AS builder WORKDIR /go/src/goauthentik.io -COPY . . +RUN --mount=type=bind,target=/go/src/goauthentik.io/go.mod,src=./go.mod \ + --mount=type=bind,target=/go/src/goauthentik.io/go.sum,src=./go.sum \ + --mount=type=bind,target=/go/src/goauthentik.io/gen-go-api,src=./gen-go-api \ + --mount=type=cache,target=/go/pkg/mod \ + go mod download ENV CGO_ENABLED=0 -RUN go build -o /go/proxy ./cmd/proxy +COPY . . +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o /go/proxy ./cmd/proxy # Stage 3: Run FROM gcr.io/distroless/static-debian11:debug diff --git a/pyproject.toml b/pyproject.toml index 714ad0600..1b8258785 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -95,7 +95,7 @@ extension-pkg-whitelist = ["lxml", "xmlsec"] # Allow constants to be shorter than normal (and lowercase, for settings.py) const-rgx = "[a-zA-Z0-9_]{1,40}$" -ignored-modules = ["django-otp", "binascii", "socket", "zlib"] +ignored-modules = ["binascii", "socket", "zlib"] generated-members = ["xmlsec.constants.*", "xmlsec.tree.*", "xmlsec.template.*"] ignore = "migrations" max-attributes = 12 @@ -105,7 +105,7 @@ max-branches = 20 DJANGO_SETTINGS_MODULE = "authentik.root.settings" python_files = ["tests.py", "test_*.py", "*_tests.py"] junit_family = "xunit2" -addopts = "-p no:celery --junitxml=unittest.xml" +addopts = "-p no:celery --junitxml=unittest.xml -vv --full-trace --doctest-modules" filterwarnings = [ "ignore:defusedxml.lxml is no longer supported and will be removed in a future release.:DeprecationWarning", "ignore:SelectableGroups dict interface is deprecated. Use select.:DeprecationWarning", @@ -113,7 +113,7 @@ filterwarnings = [ [tool.poetry] name = "authentik" -version = "2023.8.1" +version = "2023.8.3" description = "" authors = ["authentik Team "] @@ -131,7 +131,6 @@ django = "*" django-filter = "*" django-guardian = "*" django-model-utils = "*" -django-otp = "*" django-prometheus = "*" django-redis = "*" djangorestframework = "*" @@ -183,6 +182,7 @@ coverage = { extras = ["toml"], version = "*" } debugpy = "*" django-silk = "*" drf-jsonschema-serializer = "*" +freezegun = "*" importlib-metadata = "*" pdoc = "*" pylint = "*" diff --git a/radius.Dockerfile b/radius.Dockerfile index 23c6b548a..8b6d84900 100644 --- a/radius.Dockerfile +++ b/radius.Dockerfile @@ -1,11 +1,19 @@ # Stage 1: Build -FROM docker.io/golang:1.21.0-bookworm AS builder +FROM docker.io/golang:1.21.1-bookworm AS builder WORKDIR /go/src/goauthentik.io -COPY . . +RUN --mount=type=bind,target=/go/src/goauthentik.io/go.mod,src=./go.mod \ + --mount=type=bind,target=/go/src/goauthentik.io/go.sum,src=./go.sum \ + --mount=type=bind,target=/go/src/goauthentik.io/gen-go-api,src=./gen-go-api \ + --mount=type=cache,target=/go/pkg/mod \ + go mod download + ENV CGO_ENABLED=0 -RUN go build -o /go/radius ./cmd/radius +COPY . . +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o /go/radius ./cmd/radius # Stage 2: Run FROM gcr.io/distroless/static-debian11:debug diff --git a/schema.yml b/schema.yml index 933152ab8..616397b3e 100644 --- a/schema.yml +++ b/schema.yml @@ -1,7 +1,7 @@ openapi: 3.0.3 info: title: authentik - version: 2023.8.1 + version: 2023.8.3 description: Making authentication simple. contact: email: hello@goauthentik.io @@ -885,7 +885,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -918,7 +918,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -957,7 +957,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -995,7 +995,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -2030,7 +2030,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -2063,7 +2063,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -2102,7 +2102,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -2140,7 +2140,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -2170,7 +2170,7 @@ paths: name: id schema: type: integer - description: A unique integer value identifying this static device. + description: A unique integer value identifying this Static device. required: true tags: - authenticators @@ -12994,7 +12994,7 @@ paths: schema: type: string format: uuid - description: A UUID string identifying this reputation. + description: A UUID string identifying this Reputation Score. required: true tags: - policies @@ -13028,7 +13028,7 @@ paths: schema: type: string format: uuid - description: A UUID string identifying this reputation. + description: A UUID string identifying this Reputation Score. required: true tags: - policies @@ -13059,7 +13059,7 @@ paths: schema: type: string format: uuid - description: A UUID string identifying this reputation. + description: A UUID string identifying this Reputation Score. required: true tags: - policies @@ -26726,6 +26726,7 @@ components: - authentik.sources.oauth - authentik.sources.plex - authentik.sources.saml + - authentik.stages.authenticator - authentik.stages.authenticator_duo - authentik.stages.authenticator_sms - authentik.stages.authenticator_static @@ -26775,6 +26776,7 @@ components: * `authentik.sources.oauth` - authentik Sources.OAuth * `authentik.sources.plex` - authentik Sources.Plex * `authentik.sources.saml` - authentik Sources.SAML + * `authentik.stages.authenticator` - authentik Stages.Authenticator * `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo * `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS * `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static @@ -29509,6 +29511,7 @@ components: * `authentik.sources.oauth` - authentik Sources.OAuth * `authentik.sources.plex` - authentik Sources.Plex * `authentik.sources.saml` - authentik Sources.SAML + * `authentik.stages.authenticator` - authentik Stages.Authenticator * `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo * `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS * `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static @@ -29556,7 +29559,7 @@ components: * `authentik_policies_expression.expressionpolicy` - Expression Policy * `authentik_policies_password.passwordpolicy` - Password Policy * `authentik_policies_reputation.reputationpolicy` - Reputation Policy - * `authentik_policies_reputation.reputation` - reputation + * `authentik_policies_reputation.reputation` - Reputation Score * `authentik_policies.policybinding` - Policy Binding * `authentik_providers_ldap.ldapprovider` - LDAP Provider * `authentik_providers_oauth2.scopemapping` - Scope Mapping @@ -29583,7 +29586,9 @@ components: * `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage * `authentik_stages_authenticator_sms.smsdevice` - SMS Device * `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Stage + * `authentik_stages_authenticator_static.staticdevice` - Static device * `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + * `authentik_stages_authenticator_totp.totpdevice` - TOTP device * `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage * `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage * `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device @@ -29699,6 +29704,7 @@ components: * `authentik.sources.oauth` - authentik Sources.OAuth * `authentik.sources.plex` - authentik Sources.Plex * `authentik.sources.saml` - authentik Sources.SAML + * `authentik.stages.authenticator` - authentik Stages.Authenticator * `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo * `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS * `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static @@ -29746,7 +29752,7 @@ components: * `authentik_policies_expression.expressionpolicy` - Expression Policy * `authentik_policies_password.passwordpolicy` - Password Policy * `authentik_policies_reputation.reputationpolicy` - Reputation Policy - * `authentik_policies_reputation.reputation` - reputation + * `authentik_policies_reputation.reputation` - Reputation Score * `authentik_policies.policybinding` - Policy Binding * `authentik_providers_ldap.ldapprovider` - LDAP Provider * `authentik_providers_oauth2.scopemapping` - Scope Mapping @@ -29773,7 +29779,9 @@ components: * `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage * `authentik_stages_authenticator_sms.smsdevice` - SMS Device * `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Stage + * `authentik_stages_authenticator_static.staticdevice` - Static device * `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + * `authentik_stages_authenticator_totp.totpdevice` - TOTP device * `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage * `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage * `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device @@ -31931,7 +31939,9 @@ components: - authentik_stages_authenticator_sms.authenticatorsmsstage - authentik_stages_authenticator_sms.smsdevice - authentik_stages_authenticator_static.authenticatorstaticstage + - authentik_stages_authenticator_static.staticdevice - authentik_stages_authenticator_totp.authenticatortotpstage + - authentik_stages_authenticator_totp.totpdevice - authentik_stages_authenticator_validate.authenticatorvalidatestage - authentik_stages_authenticator_webauthn.authenticatewebauthnstage - authentik_stages_authenticator_webauthn.webauthndevice @@ -31976,7 +31986,7 @@ components: * `authentik_policies_expression.expressionpolicy` - Expression Policy * `authentik_policies_password.passwordpolicy` - Password Policy * `authentik_policies_reputation.reputationpolicy` - Reputation Policy - * `authentik_policies_reputation.reputation` - reputation + * `authentik_policies_reputation.reputation` - Reputation Score * `authentik_policies.policybinding` - Policy Binding * `authentik_providers_ldap.ldapprovider` - LDAP Provider * `authentik_providers_oauth2.scopemapping` - Scope Mapping @@ -32003,7 +32013,9 @@ components: * `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage * `authentik_stages_authenticator_sms.smsdevice` - SMS Device * `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Stage + * `authentik_stages_authenticator_static.staticdevice` - Static device * `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + * `authentik_stages_authenticator_totp.totpdevice` - TOTP device * `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage * `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage * `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device @@ -34916,6 +34928,7 @@ components: * `authentik.sources.oauth` - authentik Sources.OAuth * `authentik.sources.plex` - authentik Sources.Plex * `authentik.sources.saml` - authentik Sources.SAML + * `authentik.stages.authenticator` - authentik Stages.Authenticator * `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo * `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS * `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static @@ -34963,7 +34976,7 @@ components: * `authentik_policies_expression.expressionpolicy` - Expression Policy * `authentik_policies_password.passwordpolicy` - Password Policy * `authentik_policies_reputation.reputationpolicy` - Reputation Policy - * `authentik_policies_reputation.reputation` - reputation + * `authentik_policies_reputation.reputation` - Reputation Score * `authentik_policies.policybinding` - Policy Binding * `authentik_providers_ldap.ldapprovider` - LDAP Provider * `authentik_providers_oauth2.scopemapping` - Scope Mapping @@ -34990,7 +35003,9 @@ components: * `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage * `authentik_stages_authenticator_sms.smsdevice` - SMS Device * `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Stage + * `authentik_stages_authenticator_static.staticdevice` - Static device * `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + * `authentik_stages_authenticator_totp.totpdevice` - TOTP device * `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage * `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage * `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device @@ -35972,8 +35987,11 @@ components: timeout: type: integer maximum: 2147483647 - minimum: -2147483648 + minimum: 0 description: Timeout after which Policy execution is terminated. + failure_result: + type: boolean + description: Result if the Policy execution fails. PatchedPromptRequest: type: object description: Prompt Serializer @@ -37064,8 +37082,11 @@ components: timeout: type: integer maximum: 2147483647 - minimum: -2147483648 + minimum: 0 description: Timeout after which Policy execution is terminated. + failure_result: + type: boolean + description: Result if the Policy execution fails. required: - group_obj - order @@ -37103,8 +37124,11 @@ components: timeout: type: integer maximum: 2147483647 - minimum: -2147483648 + minimum: 0 description: Timeout after which Policy execution is terminated. + failure_result: + type: boolean + description: Result if the Policy execution fails. required: - order - target @@ -38508,8 +38532,7 @@ components: minLength: 1 authorization_flow: type: string - minLength: 1 - description: Visible in the URL. + format: uuid file: type: string format: binary @@ -39997,8 +40020,6 @@ components: type: object description: Transactional creation response properties: - valid: - type: boolean applied: type: boolean logs: @@ -40008,7 +40029,6 @@ components: required: - applied - logs - - valid TypeCreate: type: object description: Types of an object that can be created diff --git a/tests/e2e/test_flows_authenticators.py b/tests/e2e/test_flows_authenticators.py index 100b489c9..80e55b6a6 100644 --- a/tests/e2e/test_flows_authenticators.py +++ b/tests/e2e/test_flows_authenticators.py @@ -3,9 +3,6 @@ from base64 import b32decode from time import sleep from urllib.parse import parse_qs, urlparse -from django_otp.oath import TOTP -from django_otp.plugins.otp_static.models import StaticDevice, StaticToken -from django_otp.plugins.otp_totp.models import TOTPDevice from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as ec @@ -13,8 +10,13 @@ from selenium.webdriver.support.wait import WebDriverWait from authentik.blueprints.tests import apply_blueprint from authentik.flows.models import Flow -from authentik.stages.authenticator_static.models import AuthenticatorStaticStage -from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage +from authentik.stages.authenticator.oath import TOTP +from authentik.stages.authenticator_static.models import ( + AuthenticatorStaticStage, + StaticDevice, + StaticToken, +) +from authentik.stages.authenticator_totp.models import AuthenticatorTOTPStage, TOTPDevice from tests.e2e.utils import SeleniumTestCase, retry diff --git a/web/.babelrc b/web/.babelrc index 04ebad676..c6ea78f62 100644 --- a/web/.babelrc +++ b/web/.babelrc @@ -1,7 +1,7 @@ { "presets": ["@babel/env", "@babel/typescript"], "plugins": [ - ["@babel/plugin-proposal-private-methods", { "loose": true }], + ["@babel/plugin-transform-private-methods", { "loose": true }], ["babel-plugin-tsconfig-paths", {}], [ "@babel/plugin-proposal-decorators", @@ -10,7 +10,7 @@ } ], [ - "@babel/plugin-proposal-class-properties", + "@babel/plugin-transform-class-properties", { "loose": true } @@ -23,7 +23,7 @@ ], "macros", [ - "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-transform-private-property-in-object", { "loose": true } diff --git a/web/.eslintrc.precommit.json b/web/.eslintrc.precommit.json new file mode 100644 index 000000000..1e2b810a1 --- /dev/null +++ b/web/.eslintrc.precommit.json @@ -0,0 +1,29 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:lit/recommended", + "plugin:custom-elements/recommended", + "plugin:storybook/recommended", + "plugin:sonarjs/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint", "lit", "custom-elements", "sonarjs"], + "rules": { + "indent": "off", + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double", { "avoidEscape": true }], + "semi": ["error", "always"], + "@typescript-eslint/ban-ts-comment": "off", + "sonarjs/cognitive-complexity": ["error", 9], + "sonarjs/no-nested-template-literals": "off" + } +} diff --git a/web/package-lock.json b/web/package-lock.json index 64ec979b2..03db50987 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -15,23 +15,24 @@ "@codemirror/lang-xml": "^6.0.2", "@codemirror/legacy-modes": "^6.3.3", "@codemirror/theme-one-dark": "^6.1.2", - "@formatjs/intl-listformat": "^7.4.0", + "@formatjs/intl-listformat": "^7.4.2", "@fortawesome/fontawesome-free": "^6.4.2", - "@goauthentik/api": "^2023.8.1-1693420817", - "@lit-labs/context": "^0.4.0", - "@lit-labs/task": "^3.0.1", + "@goauthentik/api": "^2023.8.3-1694987749", + "@lit-labs/context": "^0.4.1", + "@lit-labs/task": "^3.0.2", "@lit/localize": "^0.11.4", + "@open-wc/lit-helpers": "^0.6.0", "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", - "@sentry/browser": "^7.65.0", - "@sentry/tracing": "^7.65.0", + "@sentry/browser": "^7.69.0", + "@sentry/tracing": "^7.69.0", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.0", "chartjs-adapter-moment": "^1.0.1", "codemirror": "^6.0.1", "construct-style-sheets-polyfill": "^3.1.0", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "country-flag-icons": "^1.5.7", "fuse.js": "^6.6.2", "lit": "^2.8.0", @@ -42,64 +43,66 @@ "yaml": "^2.3.2" }, "devDependencies": { - "@babel/core": "^7.22.11", + "@babel/core": "^7.22.20", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.22.10", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-runtime": "^7.22.10", - "@babel/preset-env": "^7.22.10", - "@babel/preset-typescript": "^7.22.11", + "@babel/plugin-proposal-decorators": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-runtime": "^7.22.15", + "@babel/preset-env": "^7.22.20", + "@babel/preset-typescript": "^7.22.15", "@hcaptcha/types": "^1.0.3", "@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0", - "@lit/localize-tools": "^0.6.9", + "@lit/localize-tools": "^0.6.10", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.3", - "@storybook/addon-essentials": "^7.4.0", - "@storybook/addon-links": "^7.4.0", + "@storybook/addon-essentials": "^7.4.2", + "@storybook/addon-links": "^7.4.2", "@storybook/blocks": "^7.1.1", - "@storybook/web-components": "^7.4.0", - "@storybook/web-components-vite": "^7.4.0", + "@storybook/web-components": "^7.4.2", + "@storybook/web-components-vite": "^7.4.2", "@trivago/prettier-plugin-sort-imports": "^4.2.0", - "@types/chart.js": "^2.9.37", - "@types/codemirror": "5.60.9", + "@types/chart.js": "^2.9.38", + "@types/codemirror": "5.60.10", "@types/grecaptcha": "^3.0.4", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", "babel-plugin-macros": "^3.1.0", "babel-plugin-tsconfig-paths": "^1.0.3", - "eslint": "^8.48.0", + "cross-env": "^7.0.3", + "eslint": "^8.49.0", "eslint-config-google": "^0.14.0", "eslint-plugin-custom-elements": "0.0.8", "eslint-plugin-lit": "^1.9.1", + "eslint-plugin-sonarjs": "^0.21.0", "eslint-plugin-storybook": "^0.6.13", "lit-analyzer": "^1.2.1", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", - "pyright": "^1.1.325", + "pyright": "^1.1.327", "react": "^18.2.0", "react-dom": "^18.2.0", - "rollup": "^3.28.1", - "rollup-plugin-copy": "^3.4.0", + "rollup": "^3.29.2", + "rollup-plugin-copy": "^3.5.0", "rollup-plugin-cssimport": "^1.0.3", "rollup-plugin-postcss-lit": "^2.1.0", - "storybook": "^7.4.0", + "storybook": "^7.4.2", "storybook-addon-mock": "^4.2.1", "ts-lit-plugin": "^1.2.1", "tslib": "^2.6.2", "turnstile-types": "^1.1.2", "typescript": "^5.2.2", - "vite-tsconfig-paths": "^4.2.0" + "vite-tsconfig-paths": "^4.2.1" }, "optionalDependencies": { - "@esbuild/darwin-arm64": "^0.19.2", + "@esbuild/darwin-arm64": "^0.19.3", "@esbuild/linux-amd64": "^0.18.11", - "@esbuild/linux-arm64": "^0.19.2" + "@esbuild/linux-arm64": "^0.19.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -145,12 +148,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -158,30 +161,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -197,12 +200,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -224,25 +227,25 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -252,15 +255,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", - "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -275,9 +278,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -308,9 +311,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -342,40 +345,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", + "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -406,14 +409,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -485,55 +488,55 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", - "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -545,9 +548,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", - "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -557,9 +560,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -572,14 +575,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -592,6 +595,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -605,12 +609,12 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz", - "integrity": "sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz", + "integrity": "sha512-kc0VvbbUyKelvzcKOSyQUSVVXS5pT3UhRB0e3c9An86MvLqs+gx0dN4asllrDluqSa3m9YyooXKGOFVomnyFkg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", @@ -627,6 +631,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -643,6 +648,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -656,33 +662,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1001,9 +985,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -1051,9 +1035,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", + "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1082,12 +1066,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1099,18 +1083,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1138,9 +1122,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", + "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1184,9 +1168,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1216,9 +1200,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1248,9 +1232,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1280,9 +1264,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1311,9 +1295,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1358,12 +1342,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", - "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", + "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1375,13 +1359,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5" }, @@ -1440,9 +1424,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1456,9 +1440,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1472,16 +1456,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1507,9 +1491,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1523,9 +1507,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", + "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1540,9 +1524,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1571,13 +1555,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1635,12 +1619,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", - "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", + "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", @@ -1731,13 +1715,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz", - "integrity": "sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -1812,17 +1796,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", - "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", + "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", + "@babel/compat-data": "^7.22.20", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1843,41 +1827,41 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-block-scoping": "^7.22.15", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-destructuring": "^7.22.15", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.10", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", @@ -1891,7 +1875,7 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.19", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-regenerator": "^0.5.2", @@ -1905,26 +1889,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz", - "integrity": "sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz", + "integrity": "sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-flow-strip-types": "^7.22.5" }, "engines": { @@ -1949,16 +1921,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz", - "integrity": "sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz", + "integrity": "sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.11", - "@babel/plugin-transform-typescript": "^7.22.11" + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1968,9 +1940,9 @@ } }, "node_modules/@babel/register": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz", - "integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", + "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2111,57 +2083,57 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.6.tgz", - "integrity": "sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz", + "integrity": "sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ==", "dependencies": { "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2170,13 +2142,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2184,14 +2156,14 @@ } }, "node_modules/@braintree/sanitize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" }, "node_modules/@codemirror/autocomplete": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.8.1.tgz", - "integrity": "sha512-HpphvDcTdOx+9R3eUw9hZK9JA77jlaBF0kOt2McbyfvY0rX9pnMoO8rkkZc0GzSbzhIY4m5xJ0uHHgjfqHNmXQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.9.0.tgz", + "integrity": "sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -2206,9 +2178,9 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.2.4.tgz", - "integrity": "sha512-42lmDqVH0ttfilLShReLXsDfASKLXzfyC36bzwcqzox9PlHulMcsUOfHXNo2X2aFMVNUoQ7j+d4q5bnfseYoOA==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.2.5.tgz", + "integrity": "sha512-dSi7ow2P2YgPBZflR9AJoaTHvqmeGIgkhignYMd5zK5y6DANTvxKxp6eMEpIDUJkRAaOY/TFZ4jP1ADIO/GLVA==", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.2.0", @@ -2217,9 +2189,9 @@ } }, "node_modules/@codemirror/lang-css": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.0.tgz", - "integrity": "sha512-oyIdJM29AyRPM3+PPq1I2oIk8NpUfEN3kAM05XWDDs6o3gSneIKaVJifT2P+fqONLou2uIgXynFyMUDQvo/szA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", + "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", @@ -2281,9 +2253,9 @@ } }, "node_modules/@codemirror/language": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.8.0.tgz", - "integrity": "sha512-r1paAyWOZkfY0RaYEZj3Kul+MiQTEbDvYqf8gPGaRvNneHXCmfSaAVFjwRUPlgxS8yflMxw2CTu6uCMp8R8A2g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.9.0.tgz", + "integrity": "sha512-nFu311/0ne/qGuGCL3oKuktBgzVOaxCHZPZv1tLSZkNjPYxxvkjSbzno3MlErG2tgw1Yw1yF8BxMCegeMXqpiw==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -2302,9 +2274,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.0.tgz", - "integrity": "sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.1.tgz", + "integrity": "sha512-2Hx945qKX7FBan5/gUdTM8fsMYrNG9clIgEcPXestbLVFAUyQYFAuju/5BMNf/PwgpVaX5pvRm4+ovjbp9D9gQ==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -2312,9 +2284,9 @@ } }, "node_modules/@codemirror/search": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.0.tgz", - "integrity": "sha512-64/M40YeJPToKvGO6p3fijo2vwUEj4nACEAXElCaYQ50HrXSvRaK+NHEhSh73WFBGdvIdhrV+lL9PdJy2RfCYA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.2.tgz", + "integrity": "sha512-WRihpqd0l9cEh9J3IZe45Yi+Z5MfTsEXnyc3V7qXHP4ZYtIYpGOn+EJ7fyLIkyAm/8S6QIr7/mMISfAadf8zCg==", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -2338,9 +2310,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.17.0.tgz", - "integrity": "sha512-0yVhPSyKWwYDy6Xwd7aDoj8ZXtdoHwC7El4z1/JJpIimrtDR5CVGY4lvQ0r2hP11ezB+eCHexZ6Zbz6rPUe06A==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.18.1.tgz", + "integrity": "sha512-xcsXcMkIMd7l3WZEWoc4ljteAiqzxb5gVerRxk5132p5cLix6rTydWTQjsj2oxORepfsrwy1fC4r20iMa9plrg==", "dependencies": { "@codemirror/state": "^6.1.4", "style-mod": "^4.1.0", @@ -2376,9 +2348,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.14.tgz", - "integrity": "sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -2392,9 +2364,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz", - "integrity": "sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -2408,9 +2380,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.14.tgz", - "integrity": "sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -2424,9 +2396,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz", + "integrity": "sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==", "cpu": [ "arm64" ], @@ -2439,9 +2411,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz", - "integrity": "sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -2455,9 +2427,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz", - "integrity": "sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -2471,9 +2443,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz", - "integrity": "sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -2487,9 +2459,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz", - "integrity": "sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -2503,9 +2475,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz", + "integrity": "sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==", "cpu": [ "arm64" ], @@ -2518,9 +2490,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz", - "integrity": "sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -2534,9 +2506,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz", - "integrity": "sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -2550,9 +2522,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz", - "integrity": "sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -2566,9 +2538,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz", - "integrity": "sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -2582,9 +2554,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz", - "integrity": "sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -2598,9 +2570,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz", - "integrity": "sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -2614,9 +2586,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz", - "integrity": "sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -2630,9 +2602,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz", - "integrity": "sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -2646,9 +2618,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz", - "integrity": "sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -2662,9 +2634,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz", - "integrity": "sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -2678,9 +2650,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz", - "integrity": "sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -2694,9 +2666,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz", - "integrity": "sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -2710,9 +2682,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.14.tgz", - "integrity": "sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -2741,9 +2713,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2818,9 +2790,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2841,21 +2813,21 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.2.tgz", + "integrity": "sha512-6ArmenS6qJEWmwzczWyhvrXRdI/rI78poBcW0h/456+onlabit+2G+QxHx5xTOX60NBJQXjsCLFbW2CmsXpUog==", "dependencies": { "@floating-ui/core": "^1.4.1", "@floating-ui/utils": "^0.1.1" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -2863,33 +2835,33 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", + "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" }, "node_modules/@formatjs/ecma402-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", - "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz", + "integrity": "sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg==", "dependencies": { - "@formatjs/intl-localematcher": "0.4.0", + "@formatjs/intl-localematcher": "0.4.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/intl-listformat": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz", - "integrity": "sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.2.tgz", + "integrity": "sha512-+6bSVudEQkf12Hh7kuKt8Xv/MyFlqdwA4V4NLnTZW8uYdF9RxlOELDD0rPaOc2++TMKIzI5o6XXwHPvpL6VrPA==", "dependencies": { - "@formatjs/ecma402-abstract": "1.17.0", - "@formatjs/intl-localematcher": "0.4.0", + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/intl-localematcher": "0.4.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", - "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz", + "integrity": "sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA==", "dependencies": { "tslib": "^2.4.0" } @@ -2904,9 +2876,9 @@ } }, "node_modules/@goauthentik/api": { - "version": "2023.8.1-1693420817", - "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.8.1-1693420817.tgz", - "integrity": "sha512-XRXxxiF9gpHmiueQxIwevyGaVZi9kfblMILEIXKLXZ9TBstRi1C3WVxo08DxOwSZw4vcef3+uw406sUKRx3Z+A==" + "version": "2023.8.3-1694987749", + "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.8.3-1694987749.tgz", + "integrity": "sha512-94r8YMtuJsqIO8iel7FujXU+5qGTgIF4G0PHz2xBNEbI6cfNUFdGHwbRue2ZlaLbhEVgglXqaS8iQdQfCQ3ocA==" }, "node_modules/@hcaptcha/types": { "version": "1.0.3", @@ -2915,9 +2887,9 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2976,6 +2948,18 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -3014,6 +2998,23 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3116,9 +3117,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -3129,9 +3130,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3306,9 +3307,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -3340,21 +3341,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", @@ -3367,9 +3362,9 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@lezer/common": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.3.tgz", - "integrity": "sha512-JH4wAXCgUOcCGNekQPLhVeUtIqjH0yPBs7vvUdSjyQama9618IOKFJwkv2kcqdhF0my8hQEgCTEJU0GIgnahvA==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.4.tgz", + "integrity": "sha512-lZHlk8p67x4aIDtJl6UQrXSOP6oi7dQR3W/geFVrENdA1JDaAJWldnVqVjPMJupbTKbzDfFcePfKttqVidS/dg==" }, "node_modules/@lezer/css": { "version": "1.1.3", @@ -3399,18 +3394,18 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.4.tgz", - "integrity": "sha512-0BiBjpEcrt2IXrIzEAsdTLylrVhGHRqVQL3baTBx1sf4qewjIvhG1/pTUumu7W/7YR0AASjLQOQxFmo5EvNmzQ==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.7.tgz", + "integrity": "sha512-OVWlK0YEi7HM+9JRWtRkir8qvcg0/kVYg2TAMHlVtl6DU1C9yK1waEOLBMztZsV/axRJxsqfJKhzYz+bxZme5g==", "dependencies": { "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "node_modules/@lezer/lr": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.9.tgz", - "integrity": "sha512-XPz6dzuTHlnsbA5M2DZgjflNQ+9Hi5Swhic0RULdp3oOs3rh6bqGZolosVqN/fQIT8uNiepzINJDnS39oweTHQ==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.10.tgz", + "integrity": "sha512-BZfVvf7Re5BIwJHlZXbJn9L8lus5EonxQghyn+ih8Wl36XMFBPTXC0KM0IdUtj9w/diPHsKlXVgL+AlX2jYJ0Q==", "dependencies": { "@lezer/common": "^1.0.0" } @@ -3434,9 +3429,9 @@ } }, "node_modules/@lit-labs/context": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@lit-labs/context/-/context-0.4.0.tgz", - "integrity": "sha512-NENAYRxRUgdS1rVVrahOCzVs6JzWdREtw8GjgTVpFBy20oqZGC5tazFYpvE5m5BkKMAAQnej9hAGROb553c85g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@lit-labs/context/-/context-0.4.1.tgz", + "integrity": "sha512-o+uKepgEPoYAVaPvSASoDiUWKdcf7neyhFcm9dvtiLgptKoINZD1vW7GbbH/2hPtxLxgcmVfZ9NDCXNDQeHTHQ==", "dependencies": { "@lit/reactive-element": "^1.5.0", "lit": "^2.7.0" @@ -3448,9 +3443,9 @@ "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" }, "node_modules/@lit-labs/task": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@lit-labs/task/-/task-3.0.1.tgz", - "integrity": "sha512-+VKnnVLRitDIpd/PBCTHAc012B5Xn43Sfq1scFt23aq0sxnAbTrapLR1ST2DgLRohBg/c4KlMIvgYf/5TZHqHw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@lit-labs/task/-/task-3.0.2.tgz", + "integrity": "sha512-X6d+KWZR3q1ZrXs/auM5PbZcW3B5RlpU4gqk/upstwTZM6JN19P6o9Qgo+qjovIDsUZsYnlGQqtdPBwPrKzLUA==", "dependencies": { "@lit/reactive-element": "^1.1.0" } @@ -3465,19 +3460,20 @@ } }, "node_modules/@lit/localize-tools": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/@lit/localize-tools/-/localize-tools-0.6.9.tgz", - "integrity": "sha512-eG2EVRBYDzii/yHpR4NYpLB+L+Pc6Y+W7Q4Xcqk9KsHsElzr/4yKJxMIU2/LpudrnBr0JGYDQa1sxb0orezDJw==", + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/@lit/localize-tools/-/localize-tools-0.6.10.tgz", + "integrity": "sha512-RUzduIRMBdKhCNT9TpcZN6WQ4iDkBnManDBn8WURR8XrI8JJBGx6zUAYsSV2VwpuSJfAu3kIFmuSfa8/8XACow==", "dev": true, "dependencies": { "@lit/localize": "^0.11.0", + "@parse5/tools": "^0.3.0", "@xmldom/xmldom": "^0.8.2", "fast-glob": "^3.2.7", "fs-extra": "^10.0.0", "jsonschema": "^1.4.0", "lit": "^2.7.0", "minimist": "^1.2.5", - "parse5": "^6.0.1", + "parse5": "^7.1.1", "source-map-support": "^0.5.19", "typescript": "^4.7.4" }, @@ -3485,6 +3481,18 @@ "lit-localize": "bin/lit-localize.js" } }, + "node_modules/@lit/localize-tools/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@lit/localize-tools/node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -3499,9 +3507,9 @@ } }, "node_modules/@lit/reactive-element": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.2.tgz", - "integrity": "sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.0.0" } @@ -3588,6 +3596,35 @@ "node": ">= 8" } }, + "node_modules/@open-wc/lit-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@open-wc/lit-helpers/-/lit-helpers-0.6.0.tgz", + "integrity": "sha512-9F0Rw18Lupp8hehF299yYozN4cFMTnHeCVNtz0k18/eUkcUUb6DCWerL/ASJ9lZ4bLA/YUPmrkdgZz/xe9cKeg==", + "peerDependencies": { + "lit": "^2.0.0" + } + }, + "node_modules/@parse5/tools": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz", + "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + } + }, + "node_modules/@parse5/tools/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@patternfly/elements": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@patternfly/elements/-/elements-2.4.0.tgz", @@ -3615,9 +3652,9 @@ "integrity": "sha512-/faOTZsKkTPxuCDcWZbunknjUhJIjjN0h+OicNiFWxTq/saLp366cLhdgNf8A46oeGR/21aQTYVXTqcQA1yvOg==" }, "node_modules/@patternfly/patternfly": { - "version": "4.224.2", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-4.224.2.tgz", - "integrity": "sha512-HGNV26uyHSIECuhjPg/WGn0mXbAotcs6ODfhAOkfYjIgGylddgiwElxUe1rpEHV5mQJJ2rMn4OdeJIIpzRX61g==" + "version": "4.224.5", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-4.224.5.tgz", + "integrity": "sha512-io0huj+LCP5FgDZJDaLv1snxktTYs8iCFz/W1VDRneYoebNHLmGfQdF7Yn8bS6PF7qmN6oJKEBlq3AjmmE8vdA==" }, "node_modules/@patternfly/pfe-core": { "version": "2.4.1", @@ -4420,15 +4457,6 @@ } } }, - "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/@rollup/plugin-typescript": { "version": "11.1.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.3.tgz", @@ -4456,9 +4484,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", + "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4478,13 +4506,13 @@ } }, "node_modules/@sentry-internal/tracing": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.65.0.tgz", - "integrity": "sha512-TEYkiq5vKr1Y79YIu+UYr1sO3vEMttQOBsOZLziDbqiC7TvKUARBR4W5XWfb9qBVDeon87EFNKluW0/+7rzYWw==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.69.0.tgz", + "integrity": "sha512-4BgeWZUj9MO6IgfO93C9ocP3+AdngqujF/+zB2rFdUe+y9S6koDyUC7jr9Knds/0Ta72N/0D6PwhgSCpHK8s0Q==", "dependencies": { - "@sentry/core": "7.65.0", - "@sentry/types": "7.65.0", - "@sentry/utils": "7.65.0", + "@sentry/core": "7.69.0", + "@sentry/types": "7.69.0", + "@sentry/utils": "7.69.0", "tslib": "^2.4.1 || ^1.9.3" }, "engines": { @@ -4492,15 +4520,15 @@ } }, "node_modules/@sentry/browser": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.65.0.tgz", - "integrity": "sha512-TUzZPAXNJ/Y1yakFODYhsEtdDpLdkgjTfrx5i9MOnXQLrcRR0C4TC1KitqbP6Tv7Xha9WiR0TDZkh7gS/9RxEA==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.69.0.tgz", + "integrity": "sha512-5ls+zu2PrMhHCIIhclKQsWX5u6WH0Ez5/GgrCMZTtZ1d70ukGSRUvpZG9qGf5Cw1ezS1LY+1HCc3whf8x8lyPw==", "dependencies": { - "@sentry-internal/tracing": "7.65.0", - "@sentry/core": "7.65.0", - "@sentry/replay": "7.65.0", - "@sentry/types": "7.65.0", - "@sentry/utils": "7.65.0", + "@sentry-internal/tracing": "7.69.0", + "@sentry/core": "7.69.0", + "@sentry/replay": "7.69.0", + "@sentry/types": "7.69.0", + "@sentry/utils": "7.69.0", "tslib": "^2.4.1 || ^1.9.3" }, "engines": { @@ -4508,12 +4536,12 @@ } }, "node_modules/@sentry/core": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.65.0.tgz", - "integrity": "sha512-EwZABW8CtAbRGXV69FqeCqcNApA+Jbq308dko0W+MFdFe+9t2RGubUkpPxpJcbWy/dN2j4LiuENu1T7nWn0ZAQ==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.69.0.tgz", + "integrity": "sha512-V6jvK2lS8bhqZDMFUtvwe2XvNstFQf5A+2LMKCNBOV/NN6eSAAd6THwEpginabjet9dHsNRmMk7WNKvrUfQhZw==", "dependencies": { - "@sentry/types": "7.65.0", - "@sentry/utils": "7.65.0", + "@sentry/types": "7.69.0", + "@sentry/utils": "7.69.0", "tslib": "^2.4.1 || ^1.9.3" }, "engines": { @@ -4521,43 +4549,43 @@ } }, "node_modules/@sentry/replay": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.65.0.tgz", - "integrity": "sha512-vhlk5F9RrhMQ+gOjNlLoWXamAPLNIT6wNII1O9ae+DRhZFmiUYirP5ag6dH5lljvNZndKl+xw+lJGJ3YdjXKlQ==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.69.0.tgz", + "integrity": "sha512-oUqWyBPFUgShdVvgJtV65EQH9pVDmoYVQMOu59JI6FHVeL3ald7R5Mvz6GaNLXsirvvhp0yAkcAd2hc5Xi6hDw==", "dependencies": { - "@sentry/core": "7.65.0", - "@sentry/types": "7.65.0", - "@sentry/utils": "7.65.0" + "@sentry/core": "7.69.0", + "@sentry/types": "7.69.0", + "@sentry/utils": "7.69.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/tracing": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.65.0.tgz", - "integrity": "sha512-Afxg4c/ve5GNa1af66I5/aQR6y86vQUxJZ57AEFTzlHtzo0SIUNgjwRO54raYdUZvvKhzyoiaaX6ZO+F9xqtmw==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.69.0.tgz", + "integrity": "sha512-nhwJXyLU2KT6ci3YRUCkpFQH7RL9lpEuVDHqaJ9xLql766FJ7A7jKtRGSaefgRzJvvdKHUVboIjZnSvqIu8gWw==", "dependencies": { - "@sentry-internal/tracing": "7.65.0" + "@sentry-internal/tracing": "7.69.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.65.0.tgz", - "integrity": "sha512-YYq7IDLLhpSBTmHoyWFtq/5ZDaEJ01r7xGuhB0aSIq33cm2I7im/B3ipzoOP/ukGZSIhuYVW9t531xZEO0+6og==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.69.0.tgz", + "integrity": "sha512-zPyCox0mzitzU6SIa1KIbNoJAInYDdUpdiA+PoUmMn2hFMH1llGU/cS7f4w/mAsssTlbtlBi72RMnWUCy578bw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.65.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.65.0.tgz", - "integrity": "sha512-2JEBf4jzRSClhp+LJpX/E3QgHEeKvXqFMeNhmwQ07qqd6szhfH2ckYFj4gXk6YiGGY4Act3C6oxLfdZovG71bw==", + "version": "7.69.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.69.0.tgz", + "integrity": "sha512-4eBixe5Y+0EGVU95R4NxH3jkkjtkE4/CmSZD4In8SCkWGSauogePtq6hyiLsZuP1QHdpPb9Kt0+zYiBb2LouBA==", "dependencies": { - "@sentry/types": "7.65.0", + "@sentry/types": "7.69.0", "tslib": "^2.4.1 || ^1.9.3" }, "engines": { @@ -4571,19 +4599,19 @@ "dev": true }, "node_modules/@storybook/addon-actions": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.4.0.tgz", - "integrity": "sha512-0lHLLUlrGE7CBFrfmAXrBKu7fUIsiQlnNekuE3cIAjSgVR481bJEzYHUUoMATqpPC4GGErBdP1CZxVDDwWV8jA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.4.2.tgz", + "integrity": "sha512-aKHyYjxcWaOTf/7B8x4EmUNkDAiYJZyJfGTYg2TDEDs89x7/9slujAA01qIgOp74C9nWkHDUVdm7/J+h3kWJWw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -4611,13 +4639,13 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -4629,9 +4657,9 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -4642,9 +4670,9 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -4655,19 +4683,19 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -4686,17 +4714,17 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -4712,12 +4740,12 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -4731,13 +4759,13 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -4751,15 +4779,14 @@ } }, "node_modules/@storybook/addon-actions/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -4767,17 +4794,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-actions/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-actions/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4812,19 +4828,19 @@ "dev": true }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.4.0.tgz", - "integrity": "sha512-cEO/Tp/eRE+5bf1FGN4wKLqLDBv3EYp9enJyXV7B3cFdciqtoE7VJPZuFZkzjJN1rRcOKSZp8g5agsx+x9uNGQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.4.2.tgz", + "integrity": "sha512-Vl6Vw1NzO5jRqlAEpG017z6N79Drlp7Wpw8O9+69/dKtTNmuLqLnPxWrn4nL2CNvghHToLMpToSAFpRo2fBZBg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -4846,13 +4862,13 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -4864,9 +4880,9 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -4877,9 +4893,9 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -4890,19 +4906,19 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -4921,17 +4937,17 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -4947,12 +4963,12 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -4966,13 +4982,13 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -4986,15 +5002,14 @@ } }, "node_modules/@storybook/addon-backgrounds/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5002,17 +5017,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-backgrounds/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-backgrounds/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5047,21 +5051,21 @@ "dev": true }, "node_modules/@storybook/addon-controls": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.4.0.tgz", - "integrity": "sha512-tYDfqpTR+c9y4kElmr3aWNHPot6kYd+nruYb697LpkCdy4lFErqSo0mhvPyZfMZp2KEajfp6YJAurhQWbvbj/A==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.4.2.tgz", + "integrity": "sha512-qzSac1bulSa7mqkfBfyAqbP9PbIio5CjGJ5VyT055ab50e13gj1eS3I9EJHCupYb19E3f465QatrGhoaTsE4hg==", "dev": true, "dependencies": { - "@storybook/blocks": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/core-events": "7.4.0", - "@storybook/manager-api": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/blocks": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/core-events": "7.4.2", + "@storybook/manager-api": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -5083,13 +5087,13 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5101,9 +5105,9 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5114,9 +5118,9 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -5127,19 +5131,19 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -5158,17 +5162,17 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -5184,12 +5188,12 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -5203,13 +5207,13 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -5223,15 +5227,14 @@ } }, "node_modules/@storybook/addon-controls/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5239,17 +5242,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-controls/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-controls/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5284,26 +5276,26 @@ "dev": true }, "node_modules/@storybook/addon-docs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.4.0.tgz", - "integrity": "sha512-LJE92LUeVTgi8W4tLBEbSvCqF54snmBfTFCr46vhCFov2CE2VBgEvIX1XT3dfUgYUOtPu3RXR2C89fYgU6VYZw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.4.2.tgz", + "integrity": "sha512-MV49/bGTibk2kvufk1+JEkDe2Ii/wfh5s+zO6a7p/FRy9zK0hQy3nEc56VpQ3+KzgDr0uyZI+mYq26OPwBuKRg==", "dev": true, "dependencies": { "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/csf-plugin": "7.4.0", - "@storybook/csf-tools": "7.4.0", + "@storybook/blocks": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/csf-plugin": "7.4.2", + "@storybook/csf-tools": "7.4.2", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.4.0", - "@storybook/postinstall": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/react-dom-shim": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/node-logger": "7.4.2", + "@storybook/postinstall": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/react-dom-shim": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -5319,13 +5311,13 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5337,9 +5329,9 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5350,9 +5342,9 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -5363,17 +5355,17 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -5389,13 +5381,13 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -5409,15 +5401,14 @@ } }, "node_modules/@storybook/addon-docs/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5425,17 +5416,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-docs/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-docs/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -5451,24 +5431,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.4.0.tgz", - "integrity": "sha512-nZmNM9AKw2JXxnYUXyFKLeUF/cL7Z9E1WTeZyOFTDtU2aITRt8+LvaepwjchtPqu2B0GcQxLB5FRDdhy0I19nw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.4.2.tgz", + "integrity": "sha512-9VqVe8pUogA9TIAl9xxNSdqU1zfXXdZW6J3BfT3r0DolU4nLusejs2xIu6smhEjZ1KYD6V30Uy9HDft/GRCSnw==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.4.0", - "@storybook/addon-backgrounds": "7.4.0", - "@storybook/addon-controls": "7.4.0", - "@storybook/addon-docs": "7.4.0", - "@storybook/addon-highlight": "7.4.0", - "@storybook/addon-measure": "7.4.0", - "@storybook/addon-outline": "7.4.0", - "@storybook/addon-toolbars": "7.4.0", - "@storybook/addon-viewport": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/manager-api": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/preview-api": "7.4.0", + "@storybook/addon-actions": "7.4.2", + "@storybook/addon-backgrounds": "7.4.2", + "@storybook/addon-controls": "7.4.2", + "@storybook/addon-docs": "7.4.2", + "@storybook/addon-highlight": "7.4.2", + "@storybook/addon-measure": "7.4.2", + "@storybook/addon-outline": "7.4.2", + "@storybook/addon-toolbars": "7.4.2", + "@storybook/addon-viewport": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/manager-api": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/preview-api": "7.4.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -5481,13 +5461,13 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5499,9 +5479,9 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5512,9 +5492,9 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -5525,19 +5505,19 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -5556,17 +5536,17 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -5582,12 +5562,12 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -5601,13 +5581,13 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -5621,15 +5601,14 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5637,17 +5616,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-essentials/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5682,14 +5650,14 @@ "dev": true }, "node_modules/@storybook/addon-highlight": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.4.0.tgz", - "integrity": "sha512-kpYSb3oXI9t/1+aRJhToDZ0/1W4mu+SzTBfv9Bl2d/DogEkFzgJricoy5LtvS5EpcXUmKO1FJsw/DCm9buSL2g==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.4.2.tgz", + "integrity": "sha512-HpwQiYil9RlMz303wQ9+ElW6W+Z0baqBUemlQ1JJZ6Wm47mgVVy8vLPcdH3JQkv7E34f51apPKVKFqq49xDqaA==", "dev": true, "dependencies": { - "@storybook/core-events": "7.4.0", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.4.0" + "@storybook/preview-api": "7.4.2" }, "funding": { "type": "opencollective", @@ -5697,13 +5665,13 @@ } }, "node_modules/@storybook/addon-highlight/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5715,9 +5683,9 @@ } }, "node_modules/@storybook/addon-highlight/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5728,9 +5696,9 @@ } }, "node_modules/@storybook/addon-highlight/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -5741,17 +5709,17 @@ } }, "node_modules/@storybook/addon-highlight/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -5767,15 +5735,14 @@ } }, "node_modules/@storybook/addon-highlight/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5783,31 +5750,20 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-highlight/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-links": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.4.0.tgz", - "integrity": "sha512-lFj8fiokWKk3jx5YUQ4anQo1uCNDMP1y6nJ/92Y85vnOd1vJr3w4GlLy8eOWMABRE33AKLI5Yp6wcpWZDe7hhQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.4.2.tgz", + "integrity": "sha512-XAspek8kkfiGq3NVt8SD108m54/dJWo+iDSmW3t/BQj2+sDPW8EpOg93X08YGoGMD8FSLOToeVC2Qi+kmAV0iw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/router": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/router": "7.4.2", + "@storybook/types": "7.4.2", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -5829,13 +5785,13 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -5847,9 +5803,9 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5860,9 +5816,9 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -5873,19 +5829,19 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -5904,17 +5860,17 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -5930,12 +5886,12 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -5949,13 +5905,13 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -5969,15 +5925,14 @@ } }, "node_modules/@storybook/addon-links/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -5985,17 +5940,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-links/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-links/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6030,18 +5974,18 @@ "dev": true }, "node_modules/@storybook/addon-measure": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.4.0.tgz", - "integrity": "sha512-8YjBqm6jPOBgkRn9YnJkLN0+ghgJiukdHOa0VB3qhiT+oww4ZOZ7mc2aQRwXQoFb05UbVVG9UNxE7lhyTyaG2w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.4.2.tgz", + "integrity": "sha512-fewNqI3mDAGAhFOFh/rdDS3dJ3e1QDmSVMB0KDJ7K22HOF2To/H9QfXHV24osnBRu6QemSIqObry1leF+u5BmQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/types": "7.4.2", "tiny-invariant": "^1.3.1" }, "funding": { @@ -6062,13 +6006,13 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -6080,9 +6024,9 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6093,9 +6037,9 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6106,19 +6050,19 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -6137,17 +6081,17 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6163,12 +6107,12 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6182,13 +6126,13 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6202,15 +6146,14 @@ } }, "node_modules/@storybook/addon-measure/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -6218,17 +6161,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-measure/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-measure/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6263,18 +6195,18 @@ "dev": true }, "node_modules/@storybook/addon-outline": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.4.0.tgz", - "integrity": "sha512-CCAWFC3bfkmYPzFjOemfH/kjpqJOHt+SdJgBKmwujDy+zum0DHlUL/7rd+U32cEpezCA8bapd0hlWn59C4agHQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.4.2.tgz", + "integrity": "sha512-C6Zfoa6k2ef55O16GKV29T0wIYaDyiBtyd/fuTzz7hkpusSqKGFNeQyfG6hRmPv5yAib7+Pzl86cH3wGz85oTw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/types": "7.4.2", "ts-dedent": "^2.0.0" }, "funding": { @@ -6295,13 +6227,13 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -6313,9 +6245,9 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6326,9 +6258,9 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6339,19 +6271,19 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -6370,17 +6302,17 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6396,12 +6328,12 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6415,13 +6347,13 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6435,15 +6367,14 @@ } }, "node_modules/@storybook/addon-outline/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -6451,17 +6382,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-outline/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-outline/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6496,16 +6416,16 @@ "dev": true }, "node_modules/@storybook/addon-toolbars": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.4.0.tgz", - "integrity": "sha512-00PDLchlQXI3ZClQHU0YQBfikAAxHOhVNv2QKW54yFKmxPl+P2c/VIeir9LcPhA04smKrJTD1u+Nszd66A9xAA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.4.2.tgz", + "integrity": "sha512-zSU8GpyMKo3vGxR7LQdvw5jV/6QUOfUepS3HEYGB88vlIPK7UriV8k9HB0FObEyYZKYU7wuPYBYhXApK4ZBVUA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0" + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2" }, "funding": { "type": "opencollective", @@ -6525,13 +6445,13 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -6543,9 +6463,9 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6556,9 +6476,9 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6569,19 +6489,19 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -6600,17 +6520,17 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6626,12 +6546,12 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6645,13 +6565,13 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6665,15 +6585,14 @@ } }, "node_modules/@storybook/addon-toolbars/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -6681,17 +6600,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-toolbars/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-toolbars/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6726,18 +6634,18 @@ "dev": true }, "node_modules/@storybook/addon-viewport": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.4.0.tgz", - "integrity": "sha512-Bfoilf9eJV/C7tR8XHDxz3h8JlZ+iggoESp2Tc0bW9tlRvz+PsCqeyHhF/IgHY+gLnPal2PkK/PIM+ruO45HXA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.4.2.tgz", + "integrity": "sha512-0mlqJmHezyZG9lLpj2LKN6HTZI015T3hYuFP4MwZRj579e246DvcBTw/h3n3bjLRGglapmFqkCw9PRVMhsQ/CA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -6759,13 +6667,13 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -6777,9 +6685,9 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6790,9 +6698,9 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6803,19 +6711,19 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -6834,17 +6742,17 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -6860,12 +6768,12 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -6879,13 +6787,13 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -6899,15 +6807,14 @@ } }, "node_modules/@storybook/addon-viewport/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -6915,17 +6822,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-viewport/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/addon-viewport/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6960,15 +6856,15 @@ "dev": true }, "node_modules/@storybook/addons": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.0.27.tgz", - "integrity": "sha512-LGfd8OAwS+zl7qQyLSAg/JjkfDDyf2uhwZIMYHomv3Oow/KT8kPqAdLqmsuAYBrTFBEqX3duemdHgjG7lVv9qQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.4.1.tgz", + "integrity": "sha512-sedMROyWFwlV6gtPHeOhps2/9UpcCmMLnYDhIueu2fAw/Djz0nYVNY2N6ZNiP/eqZISTLr9RzeBfAcymyjAJ2A==", "dev": true, "peer": true, "dependencies": { - "@storybook/manager-api": "7.0.27", - "@storybook/preview-api": "7.0.27", - "@storybook/types": "7.0.27" + "@storybook/manager-api": "7.4.1", + "@storybook/preview-api": "7.4.1", + "@storybook/types": "7.4.1" }, "funding": { "type": "opencollective", @@ -6980,14 +6876,14 @@ } }, "node_modules/@storybook/api": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.0.27.tgz", - "integrity": "sha512-kvqtnahIdyp+c7qwG/IhY6e1ynet/G9k92J6n3UEpMqy0b+jKMpGE45uGdiMg5EDVGjvlDqN8Ed7v/ZDJFjlOw==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.4.1.tgz", + "integrity": "sha512-7GfzW+UdrT8KNi69YcxbQBPB/GQ63i+eqaWlPzoWRCdWxKb3im+wf/gsBuRs550F+6aqEAQH6d+e6byz7gwPog==", "dev": true, "peer": true, "dependencies": { - "@storybook/client-logger": "7.0.27", - "@storybook/manager-api": "7.0.27" + "@storybook/client-logger": "7.4.1", + "@storybook/manager-api": "7.4.1" }, "funding": { "type": "opencollective", @@ -7007,22 +6903,22 @@ } }, "node_modules/@storybook/blocks": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.0.tgz", - "integrity": "sha512-YQznNjJm+l32fCfPxrZso9+MbcyG0pWZSpx3RKI1+pxDMsAs4mbXsIw4//jKfjoDP/6/Cz/FJcSx8LT7i4BJ2w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.4.2.tgz", + "integrity": "sha512-ijuZBsYfQBuwMA8Lb1dT6t2PzqhkOtIdc+G5iQ/IgWLX5HT1br+Wq8o3TUWrqACM9VKIASnJk13FMAOeGggD/w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/components": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/components": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.4.0", + "@storybook/docs-tools": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -7046,13 +6942,13 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -7064,9 +6960,9 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7077,9 +6973,9 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -7090,19 +6986,19 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -7121,17 +7017,17 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -7147,12 +7043,12 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -7166,13 +7062,13 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -7186,15 +7082,14 @@ } }, "node_modules/@storybook/blocks/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -7202,17 +7097,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/blocks/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/blocks/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7247,15 +7131,15 @@ "dev": true }, "node_modules/@storybook/builder-manager": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.4.0.tgz", - "integrity": "sha512-4fuxVzBIBbZh2aVBizSOU5EJ8b74IhR6x2TAZjifZZf5Gdxgfgio8sAyrrd/C78vrFOFhFEgmQhMqZRuCLHxvQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.4.2.tgz", + "integrity": "sha512-MgdXr9QJ2sNk0fUshQ7hk4Ec9IkbPWR6alrmDByIOEU9bThx0j4OxU9uTLBy8r5uZsSL6nNtRyCvSP8YSKaQHQ==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.4.0", - "@storybook/manager": "7.4.0", - "@storybook/node-logger": "7.4.0", + "@storybook/core-common": "7.4.2", + "@storybook/manager": "7.4.2", + "@storybook/node-logger": "7.4.2", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", @@ -7289,20 +7173,20 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.4.0.tgz", - "integrity": "sha512-2hE+Q5zoSFQvmiPKsRaZWUX5v6vRaSp0+kgZo3EOg0DvAACiC/Cd+sdnv7wxigvSnVRMbWvBVguPyePRjke8KA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.4.2.tgz", + "integrity": "sha512-FAAq0lSCUoD+oP+aCIEuLdDr4DEgMn7RDuJrgRoFcDa3y4wWeMxsxTchCaz0Zfz7vwELwegL7KDQl2XT1uLBzQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/csf-plugin": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/csf-plugin": "7.4.2", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.4.0", - "@storybook/preview": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/node-logger": "7.4.2", + "@storybook/preview": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/types": "7.4.2", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", @@ -7337,13 +7221,13 @@ } }, "node_modules/@storybook/builder-vite/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -7355,9 +7239,9 @@ } }, "node_modules/@storybook/builder-vite/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7368,9 +7252,9 @@ } }, "node_modules/@storybook/builder-vite/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -7381,17 +7265,17 @@ } }, "node_modules/@storybook/builder-vite/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -7407,15 +7291,14 @@ } }, "node_modules/@storybook/builder-vite/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -7423,17 +7306,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-vite/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/builder-vite/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -7460,53 +7332,43 @@ "node": ">=12" } }, - "node_modules/@storybook/channel-postmessage": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.27.tgz", - "integrity": "sha512-ScpiStUHvtgy9RrCFNyzzH9l+zHF80lSwW/BZ1MRETJ9ZaOVPrm03U0Ju01wJC57DYPROwPU/wKMetNqKKEhdA==", + "node_modules/@storybook/channels": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.1.tgz", + "integrity": "sha512-gnE1mNrRF+9oCVRMq6MS/tLXJbYmf9P02PCC3KpMLcSsABdH5jcrACejzJVo/kE223knFH7NJc4BBj7+5h0uXA==", "dev": true, "peer": true, "dependencies": { - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", + "@storybook/client-logger": "7.4.1", + "@storybook/core-events": "7.4.1", "@storybook/global": "^5.0.0", "qs": "^6.10.0", - "telejson": "^7.0.3" + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/channels": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.27.tgz", - "integrity": "sha512-YppvPa1qMyC+oCQJ3tf7Quzpf2NnBlvIRLPJiGAMssUwX5qE0iKe9lTtkNwMaNxEvzz6rDxewSlz+f/MWr4gPw==", - "dev": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, "node_modules/@storybook/cli": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.4.0.tgz", - "integrity": "sha512-yn27cn3LzhTqpEVX6CzUz13KTJ3jPLA2eM4bO1t7SYUqpDlzw3lET9DIcYIaUAIiL+0r2Js3jW2BsyN/5KmO5w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.4.2.tgz", + "integrity": "sha512-WleObtC7OU2lT+pI2vTdXZPFMKDGbg3bkUJ+PG8+yqGg53ea5ZkwKWg9qHpXuiMkYDztqhbA8kYrny1GqFuVdg==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/core-server": "7.4.0", - "@storybook/csf-tools": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/telemetry": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/codemod": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/core-events": "7.4.2", + "@storybook/core-server": "7.4.2", + "@storybook/csf-tools": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/telemetry": "7.4.2", + "@storybook/types": "7.4.2", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -7547,13 +7409,13 @@ } }, "node_modules/@storybook/cli/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -7565,9 +7427,9 @@ } }, "node_modules/@storybook/cli/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7578,9 +7440,9 @@ } }, "node_modules/@storybook/cli/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -7591,15 +7453,14 @@ } }, "node_modules/@storybook/cli/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -7607,17 +7468,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/cli/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -7742,9 +7592,9 @@ "dev": true }, "node_modules/@storybook/client-logger": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.27.tgz", - "integrity": "sha512-t4F0ByHP4MNiyVI5sgqtxSccr4RmPAqTr/h6CeGLJKWzUYobBV5hwKUd/qlfwdjev2u9C7AdLFPBKVcHX5PteA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.1.tgz", + "integrity": "sha512-2j0DQlKlPNY8XAaEZv+mUYEUm4dOWg6/Q92UNbvYPRK5qbXUvbMiQco5nmvg4LvMT6y99LhRSW2xrwEx5xKAKw==", "dev": true, "peer": true, "dependencies": { @@ -7756,18 +7606,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.4.0.tgz", - "integrity": "sha512-XqNhv5bec+L7TJ5tXdsMalmJazwaFMVVxoNlnb0f9zKhovAEF2F6hl6+Pnd2avRomH9+1q7EM+GwrTCAvzAfzg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.4.2.tgz", + "integrity": "sha512-wU+SLHG/PpLptI0aWEhPxwFPcX7uYe+Id21DKNPg/HvYaLG3N+/DPDef+lm3Vaov9w4OD74iuQ3knT67SSkvmw==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/csf-tools": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/types": "7.4.2", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", @@ -7782,13 +7632,13 @@ } }, "node_modules/@storybook/codemod/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -7800,9 +7650,9 @@ } }, "node_modules/@storybook/codemod/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7813,9 +7663,9 @@ } }, "node_modules/@storybook/codemod/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -7826,15 +7676,14 @@ } }, "node_modules/@storybook/codemod/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -7842,17 +7691,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/codemod/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/codemod/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -7869,18 +7707,18 @@ } }, "node_modules/@storybook/components": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.4.0.tgz", - "integrity": "sha512-GGnQrI4NXwri/PqNjhO1vNv4tC7RBjY87ce9WHBq1ueat3kBakdqV97NzScoldXarkkKK6grBqmhw9jE5PfzhQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.4.2.tgz", + "integrity": "sha512-ecbDzSUd74vf6IwHsbQr+9mVRxKWLmwd9zJ8RHMcR8UejTRAAR/eVvYoCG331TQ8TrhTmHTy5xCVv47pm6ORkQ==", "dev": true, "dependencies": { "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -7895,13 +7733,13 @@ } }, "node_modules/@storybook/components/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -7913,9 +7751,9 @@ } }, "node_modules/@storybook/components/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7926,9 +7764,9 @@ } }, "node_modules/@storybook/components/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -7939,13 +7777,13 @@ } }, "node_modules/@storybook/components/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -7959,15 +7797,14 @@ } }, "node_modules/@storybook/components/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -7975,25 +7812,14 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/components/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/core-client": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.4.0.tgz", - "integrity": "sha512-AhysJS2HnydB8Jc+BMVzK5VLHa1liJjxroNsd+ZTgGUhD7R8wvozrswQgY4MLFtcaLwN/wDWlK2YavSBqmc94Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.4.2.tgz", + "integrity": "sha512-2K4g8ZaqBUv6oC+1/Bd6XSQ/F7hNyy8OLqnnxjoYsjUQc8DaN5wUckEEgT9WSvLQg88B/FYFtNAX5m17aySWrg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/preview-api": "7.4.0" + "@storybook/client-logger": "7.4.2", + "@storybook/preview-api": "7.4.2" }, "funding": { "type": "opencollective", @@ -8001,13 +7827,13 @@ } }, "node_modules/@storybook/core-client/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -8019,9 +7845,9 @@ } }, "node_modules/@storybook/core-client/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8032,9 +7858,9 @@ } }, "node_modules/@storybook/core-client/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8045,17 +7871,17 @@ } }, "node_modules/@storybook/core-client/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8071,15 +7897,14 @@ } }, "node_modules/@storybook/core-client/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -8087,25 +7912,15 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-client/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/core-common": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.4.0.tgz", - "integrity": "sha512-QKrBL46ZFdfTjlZE3f7b59Q5+frOHWIJ64sC9BZ2PHkZkGjFeYRDdJJ6EHLYBb+nToynl33dYN1GQz+hQn2vww==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.4.2.tgz", + "integrity": "sha512-Qj9S97TYO+jSNdC2+LrMFtZRvTnELeFnRtn/MDWhkM6mpZgRglxlZuXi5enJjqTh0dISAUxPpTtXNAJDfX99JA==", "dev": true, "dependencies": { - "@storybook/node-logger": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/core-events": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/types": "7.4.2", "@types/find-cache-dir": "^3.2.1", "@types/node": "^16.0.0", "@types/node-fetch": "^2.6.4", @@ -8133,13 +7948,13 @@ } }, "node_modules/@storybook/core-common/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -8151,9 +7966,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8164,9 +7979,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8177,15 +7992,14 @@ } }, "node_modules/@storybook/core-common/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -8194,22 +8008,11 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz", - "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==", + "version": "16.18.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.52.tgz", + "integrity": "sha512-sm2aph6cRSsTMFYFgI+RpPLunXO9ClJkpizUVdT7KmGeyfQ14xnjTMT/f3MHcfKqevXqGT6BgVFzW8wcEoDUtA==", "dev": true }, - "node_modules/@storybook/core-common/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/core-common/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8265,9 +8068,9 @@ } }, "node_modules/@storybook/core-common/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", @@ -8323,37 +8126,40 @@ } }, "node_modules/@storybook/core-events": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.27.tgz", - "integrity": "sha512-sNnqgO5i5DUIqeQfNbr987KWvAciMN9FmMBuYdKjVFMqWFyr44HTgnhfKwZZKl+VMDYkHA9Do7UGSYZIKy0P4g==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.1.tgz", + "integrity": "sha512-F1tGb32XZ4FRfbtXdi4b+zdzWUjFz5rn3TF18mSuBGGXvxKU+4tywgjGQ3dKGdvuP754czn3poSdz2ZW08bLsQ==", "dev": true, "peer": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/core-server": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.4.0.tgz", - "integrity": "sha512-AcbfXatHVx1by4R2CiPIMgjQlOL3sUbVarkhmgUcL0AWT0zC0SCQWUZdo22en+jZhAraazgXyLGNCVP7A+6Tqg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.4.2.tgz", + "integrity": "sha512-4aaFQTjb8jsbzJeCs+VTo3gdyK3r3VhQN2sxn6k/lcKjQFeO84+iqGgGmb+oWUVz2TJL+JrNh7SUXkVsMZBXVQ==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.4.0", - "@storybook/channels": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/builder-manager": "7.4.2", + "@storybook/channels": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.4.0", + "@storybook/csf-tools": "7.4.2", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/telemetry": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/telemetry": "7.4.2", + "@storybook/types": "7.4.2", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -8388,13 +8194,13 @@ } }, "node_modules/@storybook/core-server/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -8406,9 +8212,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8419,9 +8225,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8432,17 +8238,17 @@ } }, "node_modules/@storybook/core-server/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8458,15 +8264,14 @@ } }, "node_modules/@storybook/core-server/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -8475,22 +8280,11 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz", - "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==", + "version": "16.18.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.52.tgz", + "integrity": "sha512-sm2aph6cRSsTMFYFgI+RpPLunXO9ClJkpizUVdT7KmGeyfQ14xnjTMT/f3MHcfKqevXqGT6BgVFzW8wcEoDUtA==", "dev": true }, - "node_modules/@storybook/core-server/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/core-server/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8600,12 +8394,12 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.4.0.tgz", - "integrity": "sha512-X1L3l/dpz2UYjCEQlFLkW7w1A13pmzDZpJ0lotkV79PALlakMXBeoX3I2E0VMjJATV8wC9RSj56COBAs6HsPeg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.4.2.tgz", + "integrity": "sha512-b0yQ8oXEH0s3SGgjhOVrbjkc3C8IYGyTSnDtPwx/Dgmru/rC6LT7ZOdBegmGqBN1+6Ho0+AxFrmAmuuYK8p2rA==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.4.0", + "@storybook/csf-tools": "7.4.2", "unplugin": "^1.3.1" }, "funding": { @@ -8614,9 +8408,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.4.0.tgz", - "integrity": "sha512-bKyOmWPyvT50Neq2wCRr2PmVGLVVm6pOw8WL5t5jueD8sRRzo9QdfhEkqmuSyqdsBdt3SiJKL5oA6dqY5Vl9ww==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.4.2.tgz", + "integrity": "sha512-5AvF2YRcYHIqQqskb3R8JvsmSWnNwkP0CGmP8Zq7zIfK/C+npKb/onv5YQlbSgh+2UrVxVdIDLc9AepBeXC3uQ==", "dev": true, "dependencies": { "@babel/generator": "^7.22.9", @@ -8624,7 +8418,7 @@ "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -8635,13 +8429,13 @@ } }, "node_modules/@storybook/csf-tools/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -8653,9 +8447,9 @@ } }, "node_modules/@storybook/csf-tools/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8666,9 +8460,9 @@ } }, "node_modules/@storybook/csf-tools/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8679,15 +8473,14 @@ } }, "node_modules/@storybook/csf-tools/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -8695,17 +8488,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/csf-tools/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -8727,14 +8509,14 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.4.0.tgz", - "integrity": "sha512-DzXmt4JorAOePoS+sjQznf8jLPI9D5mdB1eSXjfvmGBQyyehKTZv5+TXuxYvT3iPN4rW4OPrIrQCSIrbULFdwA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.4.2.tgz", + "integrity": "sha512-MXW+xaxah+C+aqJ5178oOILqX7dCSwJMKJefIJHHwr9w6UuGRaiPG1NDYK/0N0IEv9H8pNnXPnw3R8S6x7COhQ==", "dev": true, "dependencies": { - "@storybook/core-common": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/core-common": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/types": "7.4.2", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -8745,13 +8527,13 @@ } }, "node_modules/@storybook/docs-tools/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -8763,9 +8545,9 @@ } }, "node_modules/@storybook/docs-tools/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8776,9 +8558,9 @@ } }, "node_modules/@storybook/docs-tools/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8789,17 +8571,17 @@ } }, "node_modules/@storybook/docs-tools/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8815,15 +8597,14 @@ } }, "node_modules/@storybook/docs-tools/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -8831,17 +8612,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/docs-tools/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/global": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", @@ -8849,9 +8619,9 @@ "dev": true }, "node_modules/@storybook/manager": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.4.0.tgz", - "integrity": "sha512-uOSdPBEBKg8WORUZ5HKHb4KnKcTyA5j5Q8MWy/NBaRd22JR3fQkZiKuHer9WJIOQTU+fb6KDmzhZbCTKg5Euog==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.4.2.tgz", + "integrity": "sha512-MtjmbAaf4hUObAa2ETQkm0+SzESoPeNm+TyzwZU5qq3Ouj4IOj2Ugd8EJPO3isdHxYt26A255tW/G9mb9v20fQ==", "dev": true, "funding": { "type": "opencollective", @@ -8859,26 +8629,26 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.27.tgz", - "integrity": "sha512-CVgy4ti8h0Xc4nxiPujTzhMANl9wmfLGvSA9ZX6YUBbKFV4UOL4oj105iHPW7Ngse6Qoqj0rnhkOSmLczXT03w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.1.tgz", + "integrity": "sha512-nzYasETW20uDWpfST6JFf6c/GSFB/dj7xVtg5EpvAYF8GkErCk9TvNKdLNroRrIYm5VJxHWC2V+CJ07RuX3Glw==", "dev": true, "peer": true, "dependencies": { - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", + "@storybook/channels": "7.4.1", + "@storybook/client-logger": "7.4.1", + "@storybook/core-events": "7.4.1", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.27", - "@storybook/theming": "7.0.27", - "@storybook/types": "7.0.27", + "@storybook/router": "7.4.1", + "@storybook/theming": "7.4.1", + "@storybook/types": "7.4.1", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "semver": "^7.3.7", "store2": "^2.14.2", - "telejson": "^7.0.3", + "telejson": "^7.2.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -8933,9 +8703,9 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.4.0.tgz", - "integrity": "sha512-tWSWkYyAvp6SxjIBaTklg29avzv/3Lv4c0dOG2o5tz79PyZkq9v6sQtwLLoI8EJA9Mo8Z08vaJp8NZyDQ9RCuA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.4.2.tgz", + "integrity": "sha512-iSBjhnMpWY9Hs5KGnf/xfHjGtGl740LUg4Gce874DuL773Mdc4hdppSKr4X/Pp1/AD67mNuifSXYx3V7d6XzTQ==", "dev": true, "funding": { "type": "opencollective", @@ -8943,9 +8713,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.4.0.tgz", - "integrity": "sha512-ZVBZggqkuj7ysfuHSCd/J7ovWV06zY9uWf+VU+Zw7ZeojDT8QHFrCurPsN7D9679j9vRU1/kSzqvAiStALS33g==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.4.2.tgz", + "integrity": "sha512-L9r14KqS87HPyXw0S3pK2X29ckel/4sdBSmy9nVF8n/ADafKE0pSLKB935VL0+88eMx06aT32SMcQoqjubGKWw==", "dev": true, "funding": { "type": "opencollective", @@ -8953,9 +8723,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.4.0.tgz", - "integrity": "sha512-R4LMTvUrVAbcUetRbAXpY3frkwD0eysqHrByiR73040+ngzDwtZOBAy0JfO3jw3WrWv2dn3kWlao5aEwVc9Exw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.4.2.tgz", + "integrity": "sha512-T7rAV6qQ7tBeSvgi0RuA5EU8tm1OMhU8PcCqosWGaLhMCR0VMzw1/WGKuR11g1XmzvaAm2xGgMp82nqi4G0i7A==", "dev": true, "funding": { "type": "opencollective", @@ -8963,19 +8733,18 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.27.tgz", - "integrity": "sha512-FhauTuLzRsaIaEORQP5lxYrzwRgZPMnfYEPnzduyGgPiY6VZkS6wIiO6pKzat83V1L4J7m5aZhTB3HtvTwPhvg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.1.tgz", + "integrity": "sha512-swmosWK73lP0CXDKMOwYIaaId28+muPDYX2V/0JmIOA+45HFXimeXZs3XsgVgQMutVF51QqnDA0pfrNgRofHgQ==", "dev": true, "peer": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.27", - "@storybook/channels": "7.0.27", - "@storybook/client-logger": "7.0.27", - "@storybook/core-events": "7.0.27", + "@storybook/channels": "7.4.1", + "@storybook/client-logger": "7.4.1", + "@storybook/core-events": "7.4.1", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.27", + "@storybook/types": "7.4.1", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -8991,9 +8760,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.4.0.tgz", - "integrity": "sha512-TLpb8a2hnWJoRLqoXpMADh82BFfRZll6JI2Waf1FjnvJ4SF9eS0zBbxybrjW3lFAHWy2XJi+rwcK8FiPj0iBoQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.4.2.tgz", + "integrity": "sha512-9Ae2As3Hf//mdFEAv58VgDbi9R5JRGne8Ai6Vspc5FZMCJIjr5kullckBi3n9uKRg2L8V7wjDRK8Cql2tEr0Yg==", "dev": true, "funding": { "type": "opencollective", @@ -9005,13 +8774,13 @@ } }, "node_modules/@storybook/router": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.27.tgz", - "integrity": "sha512-Onflm2mERipuYB3SR+0CFAZKPbDiLsJdgX09BP8bGrg7dVYwiGkL5dc9H/CP0KPxtC7kXT8x1Zc+yx0Y0kWiJw==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.1.tgz", + "integrity": "sha512-7tE1B18jb+5+ujXd3BHcub85QnytIVBNA0iAo+o8MNwArISyodqp12y2D3w+QpXkg0GtPhAp/CMhzpyxotPhRQ==", "dev": true, "peer": true, "dependencies": { - "@storybook/client-logger": "7.0.27", + "@storybook/client-logger": "7.4.1", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -9025,14 +8794,14 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.4.0.tgz", - "integrity": "sha512-oxCB3kIbpiDWuXEtQhk/j6t1/h0KKWAuvxmcwGPxwhEvj/uNtoM+f1qhoDID9waxNo4AccU9Px+1ZJQ+2ejcDg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.4.2.tgz", + "integrity": "sha512-ZAh1Bjk9JVpL5j0Aj3PHr3XEDZcOrFeugVyRuuul2gAyu6SbpPhl8Dd2Wr9YJS0ZDWs3u0CgKRCeFPPAi3QosA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-common": "7.4.0", - "@storybook/csf-tools": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-common": "7.4.2", + "@storybook/csf-tools": "7.4.2", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -9045,9 +8814,9 @@ } }, "node_modules/@storybook/telemetry/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -9124,14 +8893,14 @@ } }, "node_modules/@storybook/theming": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.27.tgz", - "integrity": "sha512-l2Lc8xX8QXQO8c9gpzdUUJ+0YqLoh8w74I7lzxiife0TzEQrhWD9aRJAVimm8Vzfq5x3CNeJNFHc5PcG8ypQig==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.1.tgz", + "integrity": "sha512-a4QajZbnYumq8ovtn7nW7BeNrk/TaWyKmUrIz4w08I6ghzESJA4aCWZ6394awbrruiIOzCCKOUq4mfWEsc8W6A==", "dev": true, "peer": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.27", + "@storybook/client-logger": "7.4.1", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -9145,13 +8914,13 @@ } }, "node_modules/@storybook/types": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.27.tgz", - "integrity": "sha512-pmJuIm+kGaZiDMyl2i5KFS9iGWrpW1jVcp9OMtHeK20LBzY5Hxq/JMc3E+fbVNkAX2hVlVGbbVUNPTvd9AjbrA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.1.tgz", + "integrity": "sha512-bjt1YDG9AocFBhIFRvGGbYZPlD223p+qAFcFgYdezU16fFE4ZGFUzUuq2ERkOofL7a2+OzLTCQ/SKe1jFkXCxQ==", "dev": true, "peer": true, "dependencies": { - "@storybook/channels": "7.0.27", + "@storybook/channels": "7.4.1", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" @@ -9162,18 +8931,18 @@ } }, "node_modules/@storybook/web-components": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.4.0.tgz", - "integrity": "sha512-j1OcX/rV+1GoGNuwQ6yIcsHX23tNH+qz6db2pRqRNTFwoBEGYlW2np6y56eYA3zZ1Jg6o8/oDgDPwtX3N1XWtQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.4.2.tgz", + "integrity": "sha512-Yc9XcdfdknHDfGUTWfdJ73emamcnL0Ci9jhZxZzjQrjWp9BD2XgO3WnIcePbc2Yn262kxoqovlTH5dxA7D2IIQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-client": "7.4.0", - "@storybook/docs-tools": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-client": "7.4.2", + "@storybook/docs-tools": "7.4.2", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.4.0", - "@storybook/preview-api": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/manager-api": "7.4.2", + "@storybook/preview-api": "7.4.2", + "@storybook/types": "7.4.2", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, @@ -9189,15 +8958,15 @@ } }, "node_modules/@storybook/web-components-vite": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.4.0.tgz", - "integrity": "sha512-v8S81zkx4Q6CIWogHkMQEsOZMsDzMkK1acfFzPYP84jgYOi5wrszARD+Wc1SgDiNr3fBE5MwJGl5LVN0pBgtfQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.4.2.tgz", + "integrity": "sha512-EuQl+Y0AQsbrwcQHKeaYSeZOnuehBOEyOVx6rhbjRE9GJm2idqwEE8pwgAOvOYWpWIB/zSkSqavlfemkmxsNvA==", "dev": true, "dependencies": { - "@storybook/builder-vite": "7.4.0", - "@storybook/core-server": "7.4.0", - "@storybook/node-logger": "7.4.0", - "@storybook/web-components": "7.4.0", + "@storybook/builder-vite": "7.4.2", + "@storybook/core-server": "7.4.2", + "@storybook/node-logger": "7.4.2", + "@storybook/web-components": "7.4.2", "magic-string": "^0.30.0" }, "engines": { @@ -9213,9 +8982,9 @@ } }, "node_modules/@storybook/web-components-vite/node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -9225,13 +8994,13 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/channels": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.0.tgz", - "integrity": "sha512-/1CU0s3npFumzVHLGeubSyPs21O3jNqtSppOjSB9iDTyV2GtQrjh5ntVwebfKpCkUSitx3x7TkCb9dylpEZ8+w==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.4.2.tgz", + "integrity": "sha512-Q95KnV+fTGaAV3S875+d5LlGg+bdC3bUnki3engODDS4ViSRHJ1bnXnqxKmAaS3O/52geIyWWR766YvwHw3avw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -9243,9 +9012,9 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/client-logger": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.0.tgz", - "integrity": "sha512-4pBnf7+df1wXEVcF1civqxbrtccGGHQkfWQkJo49s53RXvF7SRTcif6XTx0V3cQV0v7I1C5mmLm0LNlmjPRP1Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.4.2.tgz", + "integrity": "sha512-LC8tYrYSJwF4DHRdNYh6y8hSvccwUIv5/WOZKJDmKx7mcEm6HsVuUu16C9jsl7iy6IqJYxgVz1va3WS6852E+A==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -9256,9 +9025,9 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/core-events": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.0.tgz", - "integrity": "sha512-JavEo4dw7TQdF5pSKjk4RtqLgsG2R/eWRI8vZ3ANKa0ploGAnQR/eMTfSxf6TUH3ElBWLJhi+lvUCkKXPQD+dw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.4.2.tgz", + "integrity": "sha512-WCEBw+Ew8DrccnB0hpP9TXadreoOlMnWCyuXU2XrvmK/vde009leWQIsLs1rY+L17zDVuogBms62AxrDDJmMpw==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -9269,19 +9038,19 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/manager-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.0.tgz", - "integrity": "sha512-sBfkkt0eZGTozeKrbzMtWLEOQrgqdk24OUJlkc2IDaucR1CBNjoCMjNeYg7cLDw0rXE8W3W3AdWtJnfsUbLMAQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.4.2.tgz", + "integrity": "sha512-gKPG0At9AGhF32iwjiba+ILqswc3ZFj9ZIu5HjGEmaoiOfqI6TayuHoptup0QxkI/Hx8f9mNkHCwR9COrmb69w==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.4.0", - "@storybook/theming": "7.4.0", - "@storybook/types": "7.4.0", + "@storybook/router": "7.4.2", + "@storybook/theming": "7.4.2", + "@storybook/types": "7.4.2", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -9300,17 +9069,17 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/preview-api": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.0.tgz", - "integrity": "sha512-ndXO0Nx+eE7ktVE4EqHpQZ0guX7yYBdruDdJ7B739C0+OoPWsJN7jAzUqq0NXaBcYrdaU5gTy+KnWJUt8R+OyA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.4.2.tgz", + "integrity": "sha512-ihTHRYzI/sI6bD215aYppiWF+1u38TrlsNjFYJ/Grftbti5d40g5wCwvAXK41SxJNYpk6CRtfvNKOwbEAC33gg==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", - "@storybook/client-logger": "7.4.0", - "@storybook/core-events": "7.4.0", + "@storybook/channels": "7.4.2", + "@storybook/client-logger": "7.4.2", + "@storybook/core-events": "7.4.2", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.4.0", + "@storybook/types": "7.4.2", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -9326,12 +9095,12 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.0.tgz", - "integrity": "sha512-IATdtFL5C3ryjNQSwaQfrmiOZiVFoVNMevMoBGDC++g0laSW40TGiNK6fUjUDBKuOgbuDt4Svfbl29k21GefEg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.4.2.tgz", + "integrity": "sha512-TFpMrmliklWNSrF84kGnh3WcLZciqIvaAjhxahqD+kx070KLqjxrsiny7UC6PUUYZdjLkbR9m8n3SFdXAVKgLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -9345,13 +9114,13 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/theming": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.0.tgz", - "integrity": "sha512-eLjEf6G3cqlegfutF/iUrec9LrUjKDj7K4ZhGdACWrf7bQcODs99EK62e9/d8GNKr4b+QMSEuM6XNGaqdPnuzQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.4.2.tgz", + "integrity": "sha512-wVmxZHVCqDoZgUOXTS4HRV4UClLtCydRNOEuUZ7X08QIPSA1FVL3gEpTQJfgCsyBX/cwSSofAMUbzAGEVNo+9g==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.4.0", + "@storybook/client-logger": "7.4.2", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -9365,15 +9134,14 @@ } }, "node_modules/@storybook/web-components/node_modules/@storybook/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.0.tgz", - "integrity": "sha512-XyzYkmeklywxvElPrIWLczi/PWtEdgTL6ToT3++FVxptsC2LZKS3Ue+sBcQ9xRZhkRemw4HQHwed5EW3dO8yUg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.4.2.tgz", + "integrity": "sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.4.0", + "@storybook/channels": "7.4.2", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", - "@types/react": "^16.14.34", "file-system-cache": "2.3.0" }, "funding": { @@ -9381,17 +9149,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/web-components/node_modules/@types/react": { - "version": "16.14.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.46.tgz", - "integrity": "sha512-Am4pyXMrr6cWWw/TN3oqHtEZl0j+G6Up/O8m65+xF/3ZaUgkv1GAtTPWw4yNRmH0HJXmur6xKCKoMo3rBGynuw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@storybook/web-components/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9426,220 +9183,238 @@ "dev": true }, "node_modules/@swagger-api/apidom-ast": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-0.72.0.tgz", - "integrity": "sha512-8VuFCe5ko/WYaw86cedojgbbjPOGmZZH4FWIhBI11JWDd4qRPl1slnLO4abauRVXC57mFIJPyg2ENX5LqO8hcA==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-0.76.2.tgz", + "integrity": "sha512-yLSeI3KtfpR7tI/misqTeasFonssj9GGhCOJfSHBuRAZkrPCJf0eU8vh3pL7YPa8lqFWcPT+z/arZoMcC9VLnQ==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-error": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2", - "unraw": "^2.0.1" + "unraw": "^3.0.0" } }, "node_modules/@swagger-api/apidom-core": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-0.72.0.tgz", - "integrity": "sha512-+X/HvfOCvrvdiFB2VRr+XtZElUSF8BM4RLcs5SgDwcAZq+4nQOLykDyM0DfFV7SpGgHSkXMt/nAza/E3tWbbIg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-0.76.2.tgz", + "integrity": "sha512-366dJJM7DFONlO3nUQfQRMJpJzZjPpWZldbHJZCcvy+aCyrNYI3Waauas7fm29UXRliPirGrd9e/ZsnW3Jimag==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.72.0", + "@swagger-api/apidom-ast": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", "@types/ramda": "~0.29.3", "minim": "~0.23.8", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", - "short-unique-id": "^4.4.4", + "ramda-adjunct": "^4.1.1", + "short-unique-id": "^5.0.2", "stampit": "^4.3.2" } }, - "node_modules/@swagger-api/apidom-json-pointer": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.72.0.tgz", - "integrity": "sha512-jFf2AOptuRDHbqFfEkP5VlyzuAjf1V/b2y1fsGhUJp3mFOzX5xkNjW/3dzEVH2bDgafatYD5235TqbeCcIRRHQ==", + "node_modules/@swagger-api/apidom-error": { + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-0.76.2.tgz", + "integrity": "sha512-QxoWL+qGzwftqXSJaYLZ1Nrdtro+U1zX5Q4OLK+Ggg8Hi6Kn1SGXcHhn4JZ9J1rwrP85XCabilL3z9mhdebqWg==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", + "@types/ramda": "~0.29.3", + "ramda": "~0.29.0", + "ramda-adjunct": "^4.0.0" + } + }, + "node_modules/@swagger-api/apidom-json-pointer": { + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.76.2.tgz", + "integrity": "sha512-2XCgA4bn8vB1VMDbSiP+6SHUTiBxx1EVLW2pgqFolhLPMdiI/QBVmoW+jEkvTPo4d5gwj/vP5WDs5QnnC9VwEA==", + "dependencies": { + "@babel/runtime-corejs3": "^7.20.7", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.72.0.tgz", - "integrity": "sha512-Dj6QtJdzz95SPBjirPO3Q7kkdAr+7DpGvAJm50TE7nnkAFBpzg+IGQPxzTfHDNj7ynEDHMt5pWHK5C2TVScO0g==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.76.2.tgz", + "integrity": "sha512-ct83R5Pvc08jeOuGShO4N0ty7VO8f46WedTDCbzT4edMRhd9Xdr5UFxkwWDuliy4uLzl9ZayHygSxfnyZKQb8g==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-1": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.72.0.tgz", - "integrity": "sha512-iQNKpNzrAlK3wUx6UehgCydetFtp55qgjcb87IifKFllA7SddSgA9uY1PqL6kbd5r77VNszeIA1seU6K2frb8w==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.76.2.tgz", + "integrity": "sha512-ffV2AhF7jTBbYl2vX0nYSDufs70CmC/kNMWHkgwR2Vq86lgadUc6S/NK/djpWY8+oAU3EYmHwTqu07hpSOUb4A==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-json-schema-draft-7": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-json-schema-draft-7": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.72.0.tgz", - "integrity": "sha512-7fVyeVYlYCTBto/83Zd/AZGkrYK3HZNEKgDAjbYlqH42EYDYyik07nDoRJN7ou6nj4AyrZJn704uS7HIJqfjJg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.76.2.tgz", + "integrity": "sha512-0Y32CQE6tIt4IPsoCzWAUskZSyGkfw87IIsH5Bcm3D1qIlAhPAokQbe1212MmZoLVUvqrXDqZHXnOxxMaHZvYw==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.72.0", - "@swagger-api/apidom-core": "^0.72.0", + "@swagger-api/apidom-ast": "^0.76.2", + "@swagger-api/apidom-core": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.72.0.tgz", - "integrity": "sha512-VTWZd60BWGhk0KUx9VPKUIZyl6Tfmhis4a6qQLSTAEQqAFKRos3c9Vv2Wj1gnm66esVEDLvNOT7N/rkSVCPViQ==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.76.2.tgz", + "integrity": "sha512-i6nZtj3ie6SP1LhRtBeZNJuBppWkuC/+AsVfUzXkH5pM+3B7Puklc77hHdLtmvUTpd/iRBdlfsklvBVXJYPtUA==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", + "@swagger-api/apidom-ns-json-schema-draft-4": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.72.0.tgz", - "integrity": "sha512-0GhK7QGOU6aJ/f8TTJCPWdbboh6KzzgHiwT+vpj1NzBpYG+HTuoqbAZ8zRIDyaS2+1oZm/x3Q/IiTka7gZvrOQ==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.76.2.tgz", + "integrity": "sha512-Klyfi/1XkJVUZa1nJP87HPMjklmB3IxE+TSD27aZIEi7GKASu96euan0gflZaegexUBA9hsAngk98USbdpHpgQ==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-json-schema-draft-6": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", + "@swagger-api/apidom-ns-json-schema-draft-6": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.72.0.tgz", - "integrity": "sha512-0idpPEvs8XVj0NCSPvCw98//2yP60AR0jzDdQfIs0xtrD+RRWLg/n5MSAbYvndIYzZzJrMDLCSpisrdQkWU4Mg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.76.2.tgz", + "integrity": "sha512-tV7dfbAZjX4HHul6JzmWsipMIVHCX5fAsBwLTltq8qmF9X9m6kZwg7fb4pD+cGK2KVlZl/ucDDDIQLDRWpOAog==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-json-schema-draft-4": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.72.0.tgz", - "integrity": "sha512-BzYPgnpSNVjR2dRz7Dl6xrWCLyyNmutH6qZETY0LMrrF4KrwOa24pAfsbrWRHVHbvBGTz2s1wKxSLtT7bA6LSg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.76.2.tgz", + "integrity": "sha512-Mb9VhVacoWvQcBqxO4j0eweyM6PGupAOt7XcOL5CzID0dOU+P4BbAv6kHD++0bTqRgXk1O31HkS/yPJmPaTCrw==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.72.0", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.72.0", + "@swagger-api/apidom-ast": "^0.76.2", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-0": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.72.0.tgz", - "integrity": "sha512-wqHgHHAkWHFCMaA6UqR1kCDm/QRW4L9S37sGEbsKCNMa+8N3Jw0WT5tWLci/UBfBnAqCa6PWRj1KfAxVWvlTkw==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.76.2.tgz", + "integrity": "sha512-mJ4HLVIR9YHgWu0SiHykFQ9Sz1f3eV5Wqhrff8sH2Qll+4QSSdOOs0tW4Gp56F0HIcrU66uvrrTy1tpkO943aw==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-api-design-systems": "^0.72.0", - "@swagger-api/apidom-parser-adapter-json": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-api-design-systems": "^0.76.2", + "@swagger-api/apidom-parser-adapter-json": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.72.0.tgz", - "integrity": "sha512-hEnD+UOwYFXH2AW90gz/kLoI9Zk6cFAxiXE482x/9VxdTsa/s7XMVCZQxOsxS3VQc6z+k0dXg2OuDTiwQXbtyg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.76.2.tgz", + "integrity": "sha512-ot0F8Pw9/oWce6daDK+3srhNad/Iva/OlkVtN0S9cR58Zcn8p1F3s6RcN7ZG97i8EdBuyQj6Bm0jzXnOX+lvtQ==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-api-design-systems": "^0.72.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-api-design-systems": "^0.76.2", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.72.0.tgz", - "integrity": "sha512-l9FwpHp73dufbb/g9c9mjbxGTR0dkcWA4lAIW5o8O2Hl4EHs+HbcurjD8mg8jK0w9KtFAOEBUV9sKUmyXk3OrA==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.76.2.tgz", + "integrity": "sha512-FK06pb4w5E8RQ65Nh1FHHM8aWzPL7fHr2HeuXZkbSeKu4j0xyzwYkxZVGwZJOT6YPJR0Yrkb/2rD89CNXsLctA==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.72.0", - "@swagger-api/apidom-parser-adapter-json": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-asyncapi-2": "^0.76.2", + "@swagger-api/apidom-parser-adapter-json": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.72.0.tgz", - "integrity": "sha512-eQUPWQSn8d2Jb9BPdR+EkjC3Y0UvnM0lNXIWexweUWRIWFA2COHOla4P5RauFPbfrK7DUaUM6x4JSw/3QQsrNA==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.76.2.tgz", + "integrity": "sha512-7TGhZgHZ9nmBJnFA7YhDWbNDbKoUOGVkBqx563ExHr2FewaohiQ/wagXAhKZzOK+HS+KHvob09uROtqOWGdIew==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.72.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-asyncapi-2": "^0.76.2", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.72.0.tgz", - "integrity": "sha512-XsPwyVv/yxdRB7d+MsaiU+Fp4VjaAtCy90nXEMeAClBpPd4oZEobNqxkMnEHQGH+IhZD1AENtVEUkNMPabx0ag==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.76.2.tgz", + "integrity": "sha512-vbH7EcldZ/gSK9FnGUW1cpibM5+hiJPQcoyLmzLZe8YBxX73qzd2WAd77v+uI56eO9Z0G4KMCRCF9PDZT/tz5Q==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.72.0", - "@swagger-api/apidom-core": "^0.72.0", + "@swagger-api/apidom-ast": "^0.76.2", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2", "tree-sitter": "=0.20.4", "tree-sitter-json": "=0.20.0", @@ -9647,77 +9422,78 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.72.0.tgz", - "integrity": "sha512-iIKHoFWYQtORiq3uDE9gJDNJeI49mSIq/NbH80Lm/xBDbUZtpTmWMxMdyzntiRZKHJbH88hFz+1kS4TWGIxJCw==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.76.2.tgz", + "integrity": "sha512-Kqcq5QUgz1TcCuPaL+zU+wmdAEo7YM0LR5jyWQo3FAT3BhAsmeVv2wRZMiz9RMDrPyxzHzbJhjMZxCqL8r2G0g==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.72.0", - "@swagger-api/apidom-parser-adapter-json": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-0": "^0.76.2", + "@swagger-api/apidom-parser-adapter-json": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.72.0.tgz", - "integrity": "sha512-kz2Ne1uSdKVUS4AtuUEikPgQ8lxHxePxTdKg6nGurNGazJHRxbdLhKOtMpJYLwo3cgOWWP5TEQTsUjXdO/QStw==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.76.2.tgz", + "integrity": "sha512-kfZ4BBxww5afiIIeFT6l0/Kuob72dnYAP+Qnmp2zQB3GQUTilKqv+ddj4blCF19n8RGNERVv2RDHLTZhjg+1AA==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.72.0", - "@swagger-api/apidom-parser-adapter-json": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-1": "^0.76.2", + "@swagger-api/apidom-parser-adapter-json": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.72.0.tgz", - "integrity": "sha512-wiX3ywl9FOsObKhotFsVMMQlic8KU8aZyRGuUNRljnLsH45JkHnQXlPiKdc8G329CWl3fvMn6mOsCauqrHc1Rw==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.76.2.tgz", + "integrity": "sha512-spXabhd0sgX87QaYUDou22KduSL5GHCmLNuPDpPykYelB/zZnE8aPsrjBMIgK9CPZoQCDoWYYmtRTPfJjKwf3Q==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.72.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-0": "^0.76.2", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.72.0.tgz", - "integrity": "sha512-fULNkPWcsEy60POZ9oqkW/ZYLhvt6xlvRfIKJEwq8VMuYvE8ClP577pVMpCc1VxytSbREuswF6nOIfY4blEn/Q==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.76.2.tgz", + "integrity": "sha512-KIEg9QWeiMMKQ9VtftK+1Rc7irKQjj0VTsoEtraun9N2MWLVt7g+xZKqbqtQ4/ovv5J8JBHE+hFGLdm2qZalsg==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.72.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-1": "^0.76.2", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", "ramda-adjunct": "^4.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.72.0.tgz", - "integrity": "sha512-dkDi/YQxTWTKnGxuza5jdIeciKkOmu1TPzqinxmkQbAo5IZnPtJjAVVFqdqxnJ5MWAoD032UVef/yl0WWGEqhg==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.76.2.tgz", + "integrity": "sha512-nmEDYOfqeB8yCHbQ5yEQkJ09zIDOeX61KXTUktP4yErm96WVjIUk5YTTAkO7QbAEND9JHE+BAnS25cBC8BxFFA==", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^0.72.0", - "@swagger-api/apidom-core": "^0.72.0", + "@swagger-api/apidom-ast": "^0.76.2", + "@swagger-api/apidom-core": "^0.76.2", + "@swagger-api/apidom-error": "^0.76.2", "@types/ramda": "~0.29.3", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2", "tree-sitter": "=0.20.4", "tree-sitter-yaml": "=0.5.0", @@ -9725,35 +9501,36 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "0.72.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-0.72.0.tgz", - "integrity": "sha512-m6MrMtCGdisTWnCtzIZvb8jlgpDT64vqrZ3VXdh4TXNuXP1PMxKho1CgpFR27li3Et8VnbSl8C16pjZynl3BxA==", + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-0.76.2.tgz", + "integrity": "sha512-O1qX6Tql+B18Em/ERyqCzuhcvOG3JeRq4QIHfebzS3lNxpxX6si/z0DrL5K1azBldmnXx7UGqt/fvwq8GQJmIA==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^0.72.0", + "@swagger-api/apidom-core": "^0.76.2", "@types/ramda": "~0.29.3", "axios": "^1.4.0", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.29.0", - "ramda-adjunct": "^4.0.0", + "ramda-adjunct": "^4.1.1", "stampit": "^4.3.2" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^0.72.0", - "@swagger-api/apidom-ns-asyncapi-2": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-0": "^0.72.0", - "@swagger-api/apidom-ns-openapi-3-1": "^0.72.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^0.72.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^0.72.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^0.72.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^0.72.0", - "@swagger-api/apidom-parser-adapter-json": "^0.72.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^0.72.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^0.72.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.72.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.72.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.72.0" + "@swagger-api/apidom-error": "^0.76.2", + "@swagger-api/apidom-json-pointer": "^0.76.2", + "@swagger-api/apidom-ns-asyncapi-2": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-0": "^0.76.2", + "@swagger-api/apidom-ns-openapi-3-1": "^0.76.2", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^0.76.2", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^0.76.2", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^0.76.2", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^0.76.2", + "@swagger-api/apidom-parser-adapter-json": "^0.76.2", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^0.76.2", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^0.76.2", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.76.2", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.76.2", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.76.2" } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { @@ -9910,45 +9687,45 @@ } }, "node_modules/@types/chart.js": { - "version": "2.9.37", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.37.tgz", - "integrity": "sha512-9bosRfHhkXxKYfrw94EmyDQcdjMaQPkU1fH2tDxu8DWXxf1mjzWQAV4laJF51ZbC2ycYwNDvIm1rGez8Bug0vg==", + "version": "2.9.38", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.38.tgz", + "integrity": "sha512-rLoHHprkVEDpAXqke/xHalyXR+5Nv+3tfViwT/UnJZ41Wp/XPaSRlJKw2PU3S3tTCqKKyjkYai+VpeHoti79XQ==", "dev": true, "dependencies": { "moment": "^2.10.2" } }, "node_modules/@types/codemirror": { - "version": "5.60.9", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.9.tgz", - "integrity": "sha512-8RhLhlGo9bAkytFYKDzezorY2ojvGk+4xFEso/6Hc2oR1oE2P9lI+AEkbUW7cDlKcQAK5WJkJRBLTdjBE7xQPA==", + "version": "5.60.10", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.10.tgz", + "integrity": "sha512-ZTA3teiCWKT8HUUofqlGPlShu5ojdIajizsS0HpH6GL0/iEdjRt7fXbCLHHqKYP5k7dC/HnnWIjZAiELUwBdjQ==", "dev": true, "dependencies": { "@types/tern": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.3.tgz", + "integrity": "sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.4.tgz", + "integrity": "sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==", "dependencies": { "@types/d3-time": "*" } @@ -10014,9 +9791,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -10040,6 +9817,16 @@ "@types/node": "*" } }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -10092,9 +9879,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", "dev": true }, "node_modules/@types/mdast": { @@ -10135,9 +9922,9 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "node_modules/@types/node": { - "version": "20.4.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", - "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, "node_modules/@types/node-fetch": { @@ -10175,9 +9962,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/ramda": { @@ -10195,9 +9982,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", - "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -10218,9 +10005,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, "node_modules/@types/send": { @@ -10265,9 +10052,9 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/unist": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", - "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" }, "node_modules/@types/yargs": { "version": "17.0.24", @@ -10285,16 +10072,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz", - "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", + "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/type-utils": "6.5.0", - "@typescript-eslint/utils": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/type-utils": "6.7.0", + "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -10353,15 +10140,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", - "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz", + "integrity": "sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/typescript-estree": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4" }, "engines": { @@ -10381,13 +10168,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", - "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", + "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0" + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -10398,13 +10185,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz", - "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", + "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.5.0", - "@typescript-eslint/utils": "6.5.0", + "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/utils": "6.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -10425,9 +10212,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", - "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", + "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -10438,13 +10225,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", - "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", + "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/visitor-keys": "6.5.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/visitor-keys": "6.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -10498,17 +10285,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz", - "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.5.0", - "@typescript-eslint/types": "6.5.0", - "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/scope-manager": "6.7.0", + "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/typescript-estree": "6.7.0", "semver": "^7.5.4" }, "engines": { @@ -10556,12 +10343,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", - "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", + "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/types": "6.7.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -10578,9 +10365,9 @@ "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==" }, "node_modules/@xmldom/xmldom": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.9.tgz", - "integrity": "sha512-4VSbbcMoxc4KLjb1gs96SRmi7w4h1SF+fCoiK0XaQX62buCc1G5d0DC5bJ9xJBNPDSVCmIrcl8BiYxzjrqaaJA==", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -10896,14 +10683,15 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -10916,15 +10704,16 @@ } }, "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, "node_modules/assign-symbols": { @@ -10990,9 +10779,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -11346,9 +11135,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -11365,9 +11154,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -11502,9 +11291,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001516", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", - "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "version": "1.0.30001532", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", + "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", "dev": true, "funding": [ { @@ -11753,9 +11542,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "dev": true, "engines": { "node": ">=6" @@ -11779,6 +11568,17 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -12068,9 +11868,9 @@ } }, "node_modules/core-js": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", - "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", + "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -12078,12 +11878,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", - "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -12091,9 +11891,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz", - "integrity": "sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.2.tgz", + "integrity": "sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -12149,6 +11949,24 @@ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -12187,9 +12005,9 @@ "dev": true }, "node_modules/cytoscape": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", - "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", + "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -12900,9 +12718,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "optional": true, "engines": { "node": ">=8" @@ -13082,9 +12900,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.462", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.462.tgz", - "integrity": "sha512-ux2LqN9JKRBDKXMT+78jtiBLPiXf+rLtYlsrOg5Qn7uv6Cbg7+9JyIalE3wcqkOdB2wPCUYNWAuL7suKRMHe9w==", + "version": "1.4.513", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", + "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==", "dev": true }, "node_modules/elkjs": { @@ -13116,6 +12934,18 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/envinfo": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", @@ -13227,16 +13057,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, "node_modules/esbuild": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.14.tgz", - "integrity": "sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -13246,28 +13070,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.14", - "@esbuild/android-arm64": "0.18.14", - "@esbuild/android-x64": "0.18.14", - "@esbuild/darwin-arm64": "0.18.14", - "@esbuild/darwin-x64": "0.18.14", - "@esbuild/freebsd-arm64": "0.18.14", - "@esbuild/freebsd-x64": "0.18.14", - "@esbuild/linux-arm": "0.18.14", - "@esbuild/linux-arm64": "0.18.14", - "@esbuild/linux-ia32": "0.18.14", - "@esbuild/linux-loong64": "0.18.14", - "@esbuild/linux-mips64el": "0.18.14", - "@esbuild/linux-ppc64": "0.18.14", - "@esbuild/linux-riscv64": "0.18.14", - "@esbuild/linux-s390x": "0.18.14", - "@esbuild/linux-x64": "0.18.14", - "@esbuild/netbsd-x64": "0.18.14", - "@esbuild/openbsd-x64": "0.18.14", - "@esbuild/sunos-x64": "0.18.14", - "@esbuild/win32-arm64": "0.18.14", - "@esbuild/win32-ia32": "0.18.14", - "@esbuild/win32-x64": "0.18.14" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/esbuild-plugin-alias": { @@ -13289,9 +13113,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz", - "integrity": "sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -13305,9 +13129,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz", - "integrity": "sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -13345,16 +13169,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -13436,6 +13260,18 @@ "eslint": ">= 5" } }, + "node_modules/eslint-plugin-sonarjs": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.21.0.tgz", + "integrity": "sha512-oezUDfFT5S6j3rQheZ4DLPrbetPmMS7zHIKWGHr0CM3g5JgyZroz1FpIKa4jV83NsGpmgIeagpokWDKIJzRQmw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/eslint-plugin-storybook": { "version": "0.6.13", "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.13.tgz", @@ -13696,9 +13532,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -14174,9 +14010,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -14460,16 +14296,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -14479,9 +14316,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.215.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.215.1.tgz", - "integrity": "sha512-qq3rdRToqwesrddyXf+Ml8Tuf7TdoJS+EMbJgC6fHAVoBCXjb4mHelNd3J+jD8ts0bSHX81FG3LN7Qn/dcl6pA==", + "version": "0.216.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.216.1.tgz", + "integrity": "sha512-wstw46/C/8bRv/8RySCl15lK376j8DHxm41xFjD9eVL+jSS1UmVpbdLdA0LzGuS2v5uGgQiBLEj6mgSJQwW+MA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -14670,9 +14507,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -14689,15 +14526,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -15032,13 +14869,13 @@ } }, "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -15568,9 +15405,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -15878,16 +15715,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -15988,9 +15821,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.0.tgz", - "integrity": "sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", + "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -16082,9 +15915,9 @@ "dev": true }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -16094,8 +15927,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -16116,9 +15949,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -16185,13 +16018,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16377,6 +16210,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -16434,6 +16273,15 @@ "node": "*" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/khroma": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", @@ -16728,13 +16576,13 @@ } }, "node_modules/lit-element": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.2.tgz", - "integrity": "sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.7.0" + "lit-html": "^2.8.0" } }, "node_modules/lit-html": { @@ -16969,9 +16817,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", - "integrity": "sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz", + "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==", "dev": true, "engines": { "node": ">= 10" @@ -17982,9 +17830,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", "optional": true, "dependencies": { "semver": "^7.3.5" @@ -18057,9 +17905,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -18868,9 +18716,9 @@ } }, "node_modules/postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -19165,9 +19013,9 @@ } }, "node_modules/pyright": { - "version": "1.1.325", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.325.tgz", - "integrity": "sha512-hMvcY5G9WTRbvEKGiiqTepyORAppNPXZDUer5GZ15t1DYB79WwP3M0Tec6S0an7FDoY6eaJ5CtK+diJbmISIBQ==", + "version": "1.1.327", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.327.tgz", + "integrity": "sha512-2OgKe3//ortVz7thxoiaVSjACVtUn+hOIanrlLZCEkagdKMheLcftu6GmoLjgibV/E2SvZZ//izidxTB5vN8dQ==", "dev": true, "bin": { "pyright": "index.js", @@ -19235,9 +19083,9 @@ } }, "node_modules/ramda-adjunct": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-4.0.0.tgz", - "integrity": "sha512-W/NiJAlZdwZ/iUkWEQQgRdH5Szqqet1WoVH9cdqDVjFbVaZHuJfJRvsxqHhvq6tZse+yVbFatLDLdVa30wBlGQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-4.1.1.tgz", + "integrity": "sha512-BnCGsZybQZMDGram9y7RiryoRHS5uwx8YeGuUeDKuZuvK38XO6JJfmK85BwRWAKFA6pZ5nZBO/HBFtExVaf31w==", "engines": { "node": ">=0.10.3" }, @@ -19607,9 +19455,9 @@ } }, "node_modules/recast": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.3.tgz", - "integrity": "sha512-HbCVFh2ANP6a09nzD4lx7XthsxMOJWKX5pIcUwtLrmeEIl3I0DwjCoVXDE0Aobk+7k/mS3H50FK4iuYArpcT6Q==", + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", "dev": true, "dependencies": { "assert": "^2.0.0", @@ -19641,9 +19489,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -19843,12 +19691,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19948,9 +19796,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -19964,9 +19812,9 @@ } }, "node_modules/rollup-plugin-copy": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", - "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", "dev": true, "dependencies": { "@types/fs-extra": "^8.0.1", @@ -19979,16 +19827,6 @@ "node": ">=8.3" } }, - "node_modules/rollup-plugin-copy/node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/rollup-plugin-copy/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -20147,13 +19985,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -20274,6 +20112,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", @@ -20399,9 +20246,9 @@ } }, "node_modules/short-unique-id": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-4.4.4.tgz", - "integrity": "sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.0.2.tgz", + "integrity": "sha512-4wZq1VLV4hsEx8guP5bN7XnY8UDsVXtdUDWFMP1gvEieAXolq5fWGKpuua21PRXaLn3OybTKFQNm7JGcHSWu/Q==", "bin": { "short-unique-id": "bin/short-unique-id", "suid": "bin/short-unique-id" @@ -21027,12 +20874,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.4.0.tgz", - "integrity": "sha512-jSwbyxHlr2dTY51Pv0mzenjrMDJNZH7DQhHu4ZezpjV+QK/rLCnD+Gt/7iDSaNlsmZJejQcmURDoEybWggMOqw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.4.2.tgz", + "integrity": "sha512-UuYmdxEWEQAepfjgQFbbHTq47Xxpw16naAvJ9n/nsjMnOhYupm1ZIdWYaeNjz4LOfz+1WzgU7us0IvaBrxzl4g==", "dev": true, "dependencies": { - "@storybook/cli": "7.4.0" + "@storybook/cli": "7.4.2" }, "bin": { "sb": "index.js", @@ -21143,14 +20990,14 @@ } }, "node_modules/string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -21160,14 +21007,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -21177,28 +21024,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21303,15 +21150,15 @@ } }, "node_modules/swagger-client": { - "version": "3.19.11", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.19.11.tgz", - "integrity": "sha512-ef4t4nRGC8NuC8rz6OazEGU/QgkrFVMUba1vDmCL1Zuov50rTix9f33COr6RSmzQEc9aqY/kd+6f43a/7TbHhQ==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.20.2.tgz", + "integrity": "sha512-fjOI/ut7uCeT7CHHNNIa1WIT9SnzKxyoaVnysyuarVpSodpOq6D2loZStBGU4mwpXF+KvatCw2qQk9Ub6fRzZw==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.13", - "@swagger-api/apidom-core": ">=0.71.0 <1.0.0", - "@swagger-api/apidom-json-pointer": ">=0.71.0 <1.0.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=0.71.0 <1.0.0", - "@swagger-api/apidom-reference": ">=0.71.1 <1.0.0", + "@babel/runtime-corejs3": "^7.22.15", + "@swagger-api/apidom-core": ">=0.76.2 <1.0.0", + "@swagger-api/apidom-json-pointer": ">=0.76.2 <1.0.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=0.76.2 <1.0.0", + "@swagger-api/apidom-reference": ">=0.76.2 <1.0.0", "cookie": "~0.5.0", "cross-fetch": "^3.1.5", "deepmerge": "~4.3.0", @@ -21357,9 +21204,9 @@ "dev": true }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -21519,9 +21366,9 @@ } }, "node_modules/terser": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", - "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -21738,9 +21585,9 @@ } }, "node_modules/tocbot": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.21.0.tgz", - "integrity": "sha512-vXk8htr8mIl3hc2s2mDkaPTBfqmqZA2o0x7eXbxUibdrpEIPdpM0L9hH/RvEvlgSM+ZTgS34sGipk5+VrLJCLA==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.21.1.tgz", + "integrity": "sha512-IfajhBTeg0HlMXu1f+VMbPef05QpDTsZ9X2Yn1+8npdaXsXg/+wrm9Ze1WG5OS1UDC3qJ5EQN/XOZ3gfXjPFCw==", "dev": true }, "node_modules/toidentifier": { @@ -21821,9 +21668,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "engines": { "node": ">=16.13.0" @@ -22230,9 +22077,9 @@ } }, "node_modules/unraw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-2.0.1.tgz", - "integrity": "sha512-tdOvLfRzHolwYcHS6HIX860MkK9LQ4+oLuNwFYL7bpgTEO64PZrcQxkisgwJYCfF8sKiWLwwu1c83DvMkbefIQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" }, "node_modules/unset-value": { "version": "1.0.0", @@ -22344,12 +22191,12 @@ "dev": true }, "node_modules/url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.2.tgz", + "integrity": "sha512-7yIgNnrST44S7PJ5+jXbdIupfU1nWUdQJBFBeJRclPXiWgCvrSq5Frw8lr/i//n5sqDfzoKmBymMS81l4U/7cg==", "dependencies": { "punycode": "^1.4.1", - "qs": "^6.11.0" + "qs": "^6.11.2" } }, "node_modules/url/node_modules/punycode": { @@ -22503,15 +22350,15 @@ } }, "node_modules/vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", "dev": true, "peer": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.25", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -22559,9 +22406,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -22677,84 +22524,6 @@ "web-component-analyzer": "cli.js" } }, - "node_modules/web-component-analyzer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/web-component-analyzer/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/web-component-analyzer/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-component-analyzer/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/web-component-analyzer/node_modules/typescript": { "version": "3.9.10", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", @@ -22768,61 +22537,6 @@ "node": ">=4.2.0" } }, - "node_modules/web-component-analyzer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/web-component-analyzer/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/web-streams-polyfill": { "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", @@ -22917,17 +22631,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", - "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -22943,20 +22656,17 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -22992,68 +22702,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -23074,9 +22737,9 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" @@ -23111,6 +22774,12 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -23125,6 +22794,93 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/web/package.json b/web/package.json index 58dbe7226..4d11d2a23 100644 --- a/web/package.json +++ b/web/package.json @@ -8,22 +8,23 @@ "build-locales": "run-s build-locales:build", "build-locales:build": "lit-localize build", "build-locales:repair": "prettier --write ./src/locale-codes.ts", - "rollup:build": "node --max-old-space-size=4096 node_modules/.bin/rollup -c ./rollup.config.mjs", - "rollup:build-proxy": "node --max-old-space-size=4096 node_modules/.bin/rollup -c ./rollup.proxy.mjs", - "rollup:watch": "node --max-old-space-size=8192 node_modules/.bin/rollup -c -w", + "rollup:build": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c ./rollup.config.mjs", + "rollup:build-proxy": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c ./rollup.proxy.mjs", + "rollup:watch": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c -w", "build": "run-s build-locales rollup:build", "build-proxy": "run-s build-locales rollup:build-proxy", "watch": "run-s build-locales rollup:watch", "lint": "eslint . --max-warnings 0 --fix", + "lint:precommit": "eslint --max-warnings 0 --config ./.eslintrc.precommit.json $(git status --porcelain | grep '^[M?][M?]' | cut -c8- | grep -E '\\.(ts|js|tsx|jsx)$') ", "lint:spelling": "codespell -D - -D ../.github/codespell-dictionary.txt -I ../.github/codespell-words.txt -S './src/locales/**' ./src -s", "lit-analyse": "lit-analyzer src", - "precommit": "run-s tsc lit-analyse lint lint:spelling prettier", + "precommit": "run-s tsc lit-analyse lint:precommit lint:spelling prettier", "prettier-check": "prettier --check .", "prettier": "prettier --write .", "tsc:execute": "tsc --noEmit -p .", "tsc": "run-s build-locales tsc:execute", "storybook": "storybook dev -p 6006", - "storybook:build": "node --max-old-space-size=4096 ./node_modules/.bin/storybook build" + "storybook:build": "cross-env NODE_OPTIONS='--max_old_space_size=4096' storybook build" }, "dependencies": { "@codemirror/lang-html": "^6.4.6", @@ -32,23 +33,24 @@ "@codemirror/lang-xml": "^6.0.2", "@codemirror/legacy-modes": "^6.3.3", "@codemirror/theme-one-dark": "^6.1.2", - "@formatjs/intl-listformat": "^7.4.0", + "@formatjs/intl-listformat": "^7.4.2", "@fortawesome/fontawesome-free": "^6.4.2", - "@goauthentik/api": "^2023.8.1-1693420817", - "@lit-labs/context": "^0.4.0", - "@lit-labs/task": "^3.0.1", + "@goauthentik/api": "^2023.8.3-1694987749", + "@lit-labs/context": "^0.4.1", + "@lit-labs/task": "^3.0.2", "@lit/localize": "^0.11.4", + "@open-wc/lit-helpers": "^0.6.0", "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", - "@sentry/browser": "^7.65.0", - "@sentry/tracing": "^7.65.0", + "@sentry/browser": "^7.69.0", + "@sentry/tracing": "^7.69.0", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.0", "chartjs-adapter-moment": "^1.0.1", "codemirror": "^6.0.1", "construct-style-sheets-polyfill": "^3.1.0", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "country-flag-icons": "^1.5.7", "fuse.js": "^6.6.2", "lit": "^2.8.0", @@ -59,63 +61,65 @@ "yaml": "^2.3.2" }, "devDependencies": { - "@babel/core": "^7.22.11", + "@babel/core": "^7.22.20", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.22.10", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-runtime": "^7.22.10", - "@babel/preset-env": "^7.22.10", - "@babel/preset-typescript": "^7.22.11", + "@babel/plugin-proposal-decorators": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-runtime": "^7.22.15", + "@babel/preset-env": "^7.22.20", + "@babel/preset-typescript": "^7.22.15", "@hcaptcha/types": "^1.0.3", "@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0", - "@lit/localize-tools": "^0.6.9", + "@lit/localize-tools": "^0.6.10", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.3", - "@storybook/addon-essentials": "^7.4.0", - "@storybook/addon-links": "^7.4.0", + "@storybook/addon-essentials": "^7.4.2", + "@storybook/addon-links": "^7.4.2", "@storybook/blocks": "^7.1.1", - "@storybook/web-components": "^7.4.0", - "@storybook/web-components-vite": "^7.4.0", + "@storybook/web-components": "^7.4.2", + "@storybook/web-components-vite": "^7.4.2", "@trivago/prettier-plugin-sort-imports": "^4.2.0", - "@types/chart.js": "^2.9.37", - "@types/codemirror": "5.60.9", + "@types/chart.js": "^2.9.38", + "@types/codemirror": "5.60.10", "@types/grecaptcha": "^3.0.4", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", "babel-plugin-macros": "^3.1.0", "babel-plugin-tsconfig-paths": "^1.0.3", - "eslint": "^8.48.0", + "cross-env": "^7.0.3", + "eslint": "^8.49.0", "eslint-config-google": "^0.14.0", "eslint-plugin-custom-elements": "0.0.8", "eslint-plugin-lit": "^1.9.1", + "eslint-plugin-sonarjs": "^0.21.0", "eslint-plugin-storybook": "^0.6.13", "lit-analyzer": "^1.2.1", "npm-run-all": "^4.1.5", "prettier": "^3.0.3", - "pyright": "^1.1.325", + "pyright": "^1.1.327", "react": "^18.2.0", "react-dom": "^18.2.0", - "rollup": "^3.28.1", - "rollup-plugin-copy": "^3.4.0", + "rollup": "^3.29.2", + "rollup-plugin-copy": "^3.5.0", "rollup-plugin-cssimport": "^1.0.3", "rollup-plugin-postcss-lit": "^2.1.0", - "storybook": "^7.4.0", + "storybook": "^7.4.2", "storybook-addon-mock": "^4.2.1", "ts-lit-plugin": "^1.2.1", "tslib": "^2.6.2", "turnstile-types": "^1.1.2", "typescript": "^5.2.2", - "vite-tsconfig-paths": "^4.2.0" + "vite-tsconfig-paths": "^4.2.1" }, "optionalDependencies": { - "@esbuild/darwin-arm64": "^0.19.2", + "@esbuild/darwin-arm64": "^0.19.3", "@esbuild/linux-amd64": "^0.18.11", - "@esbuild/linux-arm64": "^0.19.2" + "@esbuild/linux-arm64": "^0.19.3" } } diff --git a/web/src/admin/AdminInterface.ts b/web/src/admin/AdminInterface.ts index 9fd6db2eb..fa6d4efa5 100644 --- a/web/src/admin/AdminInterface.ts +++ b/web/src/admin/AdminInterface.ts @@ -21,10 +21,12 @@ import { getURLParam, updateURLParams } from "@goauthentik/elements/router/Route import "@goauthentik/elements/router/RouterOutlet"; import "@goauthentik/elements/sidebar/Sidebar"; import "@goauthentik/elements/sidebar/SidebarItem"; +import { spread } from "@open-wc/lit-helpers"; import { msg, str } from "@lit/localize"; -import { CSSResult, TemplateResult, css, html } from "lit"; +import { CSSResult, TemplateResult, css, html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; +import { map } from "lit/directives/map.js"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css"; @@ -173,159 +175,117 @@ export class AdminInterface extends Interface { } renderSidebarItems(): TemplateResult { + // The second attribute type is of string[] to help with the 'activeWhen' control, which was + // commonplace and singular enough to merit its own handler. + type SidebarEntry = [ + path: string | null, + label: string, + attributes?: Record | string[] | null, // eslint-disable-line + children?: SidebarEntry[], + ]; + + // prettier-ignore + const sidebarContent: SidebarEntry[] = [ + ["/if/user/", msg("User interface"), { "?isAbsoluteLink": true, "?highlight": true }], + [null, msg("Dashboards"), { "?expanded": true }, [ + ["/administration/overview", msg("Overview")], + ["/administration/dashboard/users", msg("Users")], + ["/administration/system-tasks", msg("System Tasks")]]], + [null, msg("Applications"), null, [ + ["/core/providers", msg("Providers"), [`^/core/providers/(?${ID_REGEX})$`]], + ["/core/applications", msg("Applications"), [`^/core/applications/(?${SLUG_REGEX})$`]], + ["/outpost/outposts", msg("Outposts")]]], + [null, msg("Events"), null, [ + ["/events/log", msg("Logs"), [`^/events/log/(?${UUID_REGEX})$`]], + ["/events/rules", msg("Notification Rules")], + ["/events/transports", msg("Notification Transports")]]], + [null, msg("Customisation"), null, [ + ["/policy/policies", msg("Policies")], + ["/core/property-mappings", msg("Property Mappings")], + ["/blueprints/instances", msg("Blueprints")], + ["/policy/reputation", msg("Reputation scores")]]], + [null, msg("Flows and Stages"), null, [ + ["/flow/flows", msg("Flows"), [`^/flow/flows/(?${SLUG_REGEX})$`]], + ["/flow/stages", msg("Stages")], + ["/flow/stages/prompts", msg("Prompts")]]], + [null, msg("Directory"), null, [ + ["/identity/users", msg("Users"), [`^/identity/users/(?${ID_REGEX})$`]], + ["/identity/groups", msg("Groups"), [`^/identity/groups/(?${UUID_REGEX})$`]], + ["/core/sources", msg("Federation and Social login"), [`^/core/sources/(?${SLUG_REGEX})$`]], + ["/core/tokens", msg("Tokens and App passwords")], + ["/flow/stages/invitations", msg("Invitations")]]], + [null, msg("System"), null, [ + ["/core/tenants", msg("Tenants")], + ["/crypto/certificates", msg("Certificates")], + ["/outpost/integrations", msg("Outpost Integrations")]]] + ]; + + // Typescript requires the type here to correctly type the recursive path + type SidebarRenderer = (_: SidebarEntry) => TemplateResult; + + const renderOneSidebarItem: SidebarRenderer = ([path, label, attributes, children]) => { + const properties = Array.isArray(attributes) + ? { ".activeWhen": attributes } + : attributes ?? {}; + if (path) { + properties["path"] = path; + } + return html` + ${label ? html`${label}` : nothing} + ${map(children, renderOneSidebarItem)} + `; + }; + + // prettier-ignore return html` - ${this.version && this.version.versionCurrent !== VERSION - ? html` - - ${msg("A newer version of the frontend is available.")} - - ` - : html``} - ${this.user?.original - ? html` { - new CoreApi(DEFAULT_CONFIG).coreUsersImpersonateEndRetrieve().then(() => { - window.location.reload(); - }); - }} - > - ${msg( - str`You're currently impersonating ${this.user.user.username}. Click to stop.`, - )} - ` - : html``} - - ${msg("User interface")} - - - ${msg("Dashboards")} - - ${msg("Overview")} - - - ${msg("Users")} - - - ${msg("System Tasks")} - - - - ${msg("Applications")} - ${ID_REGEX})$`]} - > - ${msg("Providers")} - - ${SLUG_REGEX})$`]} - > - ${msg("Applications")} - - - ${msg("Outposts")} - - - - ${msg("Events")} - ${UUID_REGEX})$`]} - > - ${msg("Logs")} - - - ${msg("Notification Rules")} - - - ${msg("Notification Transports")} - - - - ${msg("Customisation")} - - ${msg("Policies")} - - - ${msg("Property Mappings")} - - - ${msg("Blueprints")} - - - ${msg("Reputation scores")} - - - - ${msg("Flows & Stages")} - ${SLUG_REGEX})$`]} - > - ${msg("Flows")} - - - ${msg("Stages")} - - - ${msg("Prompts")} - - - - ${msg("Directory")} - ${ID_REGEX})$`]} - > - ${msg("Users")} - - ${UUID_REGEX})$`]} - > - ${msg("Groups")} - - ${SLUG_REGEX})$`]} - > - ${msg("Federation & Social login")} - - - ${msg("Tokens & App passwords")} - - - ${msg("Invitations")} - - - - ${msg("System")} - - ${msg("Tenants")} - - - ${msg("Certificates")} - - - ${msg("Outpost Integrations")} - - - ${this.config?.capabilities.includes(CapabilitiesEnum.IsEnterprise) - ? html` - - ${msg("Enterprise")} - - ${msg("Licenses")} - - - ` - : html``} + ${this.renderNewVersionMessage()} + ${this.renderImpersonationMessage()} + ${map(sidebarContent, renderOneSidebarItem)} + ${this.renderEnterpriseMessage()} `; } + + renderNewVersionMessage() { + return this.version && this.version.versionCurrent !== VERSION + ? html` + + ${msg("A newer version of the frontend is available.")} + + ` + : nothing; + } + + renderImpersonationMessage() { + return this.user?.original + ? html` { + new CoreApi(DEFAULT_CONFIG).coreUsersImpersonateEndRetrieve().then(() => { + window.location.reload(); + }); + }} + > + ${msg( + str`You're currently impersonating ${this.user.user.username}. Click to stop.`, + )} + ` + : nothing; + } + + renderEnterpriseMessage() { + return this.config?.capabilities.includes(CapabilitiesEnum.IsEnterprise) + ? html` + + ${msg("Enterprise")} + + ${msg("Licenses")} + + + ` + : nothing; + } } diff --git a/web/src/admin/admin-overview/cards/RecentEventsCard.ts b/web/src/admin/admin-overview/cards/RecentEventsCard.ts index e0b75d970..11c197dd8 100644 --- a/web/src/admin/admin-overview/cards/RecentEventsCard.ts +++ b/web/src/admin/admin-overview/cards/RecentEventsCard.ts @@ -1,8 +1,9 @@ -import "@goauthentik/admin/events/EventInfo"; -import { ActionToLabel, EventGeo } from "@goauthentik/admin/events/utils"; +import { EventGeo } from "@goauthentik/admin/events/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EventWithContext } from "@goauthentik/common/events"; +import { actionToLabel } from "@goauthentik/common/labels"; import { truncate } from "@goauthentik/common/utils"; +import "@goauthentik/components/ak-event-info"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/Dropdown"; import "@goauthentik/elements/buttons/ModalButton"; @@ -68,7 +69,7 @@ export class RecentEventsCard extends Table { row(item: EventWithContext): TemplateResult[] { return [ - html` + html` ${item.app}`, item.user?.username ? html`
diff --git a/web/src/admin/applications/ApplicationListPage.ts b/web/src/admin/applications/ApplicationListPage.ts index f1d00b1ef..ca54278e2 100644 --- a/web/src/admin/applications/ApplicationListPage.ts +++ b/web/src/admin/applications/ApplicationListPage.ts @@ -3,6 +3,7 @@ import "@goauthentik/admin/applications/wizard/ak-application-wizard"; import { PFSize } from "@goauthentik/app/elements/Spinner"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { uiConfig } from "@goauthentik/common/ui/config"; +import "@goauthentik/components/ak-app-icon"; import MDApplication from "@goauthentik/docs/core/applications.md"; import "@goauthentik/elements/Markdown"; import "@goauthentik/elements/buttons/SpinnerButton"; @@ -12,7 +13,6 @@ import "@goauthentik/elements/forms/ModalForm"; import { PaginatedResponse } from "@goauthentik/elements/table/Table"; import { TableColumn } from "@goauthentik/elements/table/Table"; import { TablePage } from "@goauthentik/elements/table/TablePage"; -import "@goauthentik/user/LibraryApplication/AppIcon"; import "@patternfly/elements/pf-tooltip/pf-tooltip.js"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/applications/ApplicationViewPage.ts b/web/src/admin/applications/ApplicationViewPage.ts index 8ff27f8b9..f65182ca7 100644 --- a/web/src/admin/applications/ApplicationViewPage.ts +++ b/web/src/admin/applications/ApplicationViewPage.ts @@ -4,13 +4,13 @@ import "@goauthentik/admin/applications/ApplicationForm"; import "@goauthentik/admin/policies/BoundPoliciesList"; import { PFSize } from "@goauthentik/app/elements/Spinner"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import "@goauthentik/components/ak-app-icon"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/EmptyState"; import "@goauthentik/elements/PageHeader"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; -import "@goauthentik/user/LibraryApplication/AppIcon"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; @@ -87,7 +87,7 @@ export class ApplicationViewPage extends AKElement { .iconImage=${true} > diff --git a/web/src/admin/common/ak-crypto-certificate-search.ts b/web/src/admin/common/ak-crypto-certificate-search.ts index 15fe347c2..3d913a13a 100644 --- a/web/src/admin/common/ak-crypto-certificate-search.ts +++ b/web/src/admin/common/ak-crypto-certificate-search.ts @@ -69,7 +69,7 @@ export class AkCryptoCertificateSearch extends CustomListenerElement(AKElement) } get value() { - return this.selectedKeypair ? renderValue(this.selectedKeypair) : undefined; + return this.selectedKeypair ? renderValue(this.selectedKeypair) : null; } connectedCallback() { diff --git a/web/src/admin/common/ak-flow-search/FlowSearch.ts b/web/src/admin/common/ak-flow-search/FlowSearch.ts index c1627edcf..1f0198b98 100644 --- a/web/src/admin/common/ak-flow-search/FlowSearch.ts +++ b/web/src/admin/common/ak-flow-search/FlowSearch.ts @@ -66,7 +66,7 @@ export class FlowSearch extends CustomListenerElement(AKElement) selectedFlow?: T; get value() { - return this.selectedFlow ? getFlowValue(this.selectedFlow) : undefined; + return this.selectedFlow ? getFlowValue(this.selectedFlow) : null; } constructor() { diff --git a/web/src/admin/events/EventInfo.ts b/web/src/admin/events/EventInfo.ts deleted file mode 100644 index 178a19f06..000000000 --- a/web/src/admin/events/EventInfo.ts +++ /dev/null @@ -1,440 +0,0 @@ -import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; -import { VERSION } from "@goauthentik/common/constants"; -import { EventContext, EventModel, EventWithContext } from "@goauthentik/common/events"; -import { AKElement } from "@goauthentik/elements/Base"; -import "@goauthentik/elements/Expand"; -import "@goauthentik/elements/Spinner"; -import { PFSize } from "@goauthentik/elements/Spinner"; - -import { msg, str } from "@lit/localize"; -import { CSSResult, TemplateResult, css, html } from "lit"; -import { customElement, property } from "lit/decorators.js"; -import { until } from "lit/directives/until.js"; - -import PFButton from "@patternfly/patternfly/components/Button/button.css"; -import PFCard from "@patternfly/patternfly/components/Card/card.css"; -import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; -import PFList from "@patternfly/patternfly/components/List/list.css"; -import PFFlex from "@patternfly/patternfly/layouts/Flex/flex.css"; -import PFBase from "@patternfly/patternfly/patternfly-base.css"; - -import { EventActions, FlowsApi } from "@goauthentik/api"; - -@customElement("ak-event-info") -export class EventInfo extends AKElement { - @property({ attribute: false }) - event!: EventWithContext; - - static get styles(): CSSResult[] { - return [ - PFBase, - PFButton, - PFFlex, - PFCard, - PFList, - PFDescriptionList, - css` - code { - display: block; - white-space: pre-wrap; - word-break: break-all; - } - .pf-l-flex { - justify-content: space-between; - } - .pf-l-flex__item { - min-width: 25%; - } - iframe { - width: 100%; - height: 50rem; - } - `, - ]; - } - - getModelInfo(context: EventModel): TemplateResult { - if (context === null) { - return html`-`; - } - return html`
-
-
-
- ${msg("UID")} -
-
-
${context.pk}
-
-
-
-
- ${msg("Name")} -
-
-
${context.name}
-
-
-
-
- ${msg("App")} -
-
-
${context.app}
-
-
-
-
- ${msg("Model Name")} -
-
-
${context.model_name}
-
-
-
-
`; - } - - getEmailInfo(context: EventContext): TemplateResult { - if (context === null) { - return html`-`; - } - return html`
-
-
- ${msg("Message")} -
-
-
${context.message}
-
-
-
-
- ${msg("Subject")} -
-
-
${context.subject}
-
-
-
-
- ${msg("From")} -
-
-
${context.from_email}
-
-
-
-
- ${msg("To")} -
-
-
- ${(context.to_email as string[]).map((to) => { - return html`
  • ${to}
  • `; - })} -
    -
    -
    -
    `; - } - - defaultResponse(): TemplateResult { - return html`
    -
    -
    ${msg("Context")}
    -
    - ${JSON.stringify(this.event?.context, null, 4)} -
    -
    -
    -
    ${msg("User")}
    -
    - ${JSON.stringify(this.event?.user, null, 4)} -
    -
    -
    `; - } - - buildGitHubIssueUrl(context: EventContext): string { - const httpRequest = this.event.context.http_request as EventContext; - let title = ""; - if (httpRequest) { - title = `${httpRequest?.method} ${httpRequest?.path}`; - } - // https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-issues/about-automation-for-issues-and-pull-requests-with-query-parameters - const fullBody = ` -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Logs** -
    - Stacktrace from authentik - -\`\`\` -${context.message as string} -\`\`\` -
    - - -**Version and Deployment (please complete the following information):** -- authentik version: ${VERSION} -- Deployment: [e.g. docker-compose, helm] - -**Additional context** -Add any other context about the problem here. - `; - return `https://github.com/goauthentik/authentik/issues/ -new?labels=bug,from_authentik&title=${encodeURIComponent(title)} -&body=${encodeURIComponent(fullBody)}`.trim(); - } - - render(): TemplateResult { - if (!this.event) { - return html``; - } - switch (this.event?.action) { - case EventActions.ModelCreated: - case EventActions.ModelUpdated: - case EventActions.ModelDeleted: - return html` -
    ${msg("Affected model:")}
    -
    - ${this.getModelInfo(this.event.context?.model as EventModel)} -
    - `; - case EventActions.AuthorizeApplication: - return html`
    -
    -
    ${msg("Authorized application:")}
    -
    - ${this.getModelInfo( - this.event.context.authorized_application as EventModel, - )} -
    -
    -
    -
    ${msg("Using flow")}
    -
    - ${until( - new FlowsApi(DEFAULT_CONFIG) - .flowsInstancesList({ - flowUuid: this.event.context.flow as string, - }) - .then((resp) => { - return html`${resp.results[0].name}`; - }), - html``, - )} - -
    -
    -
    - ${this.defaultResponse()}`; - case EventActions.EmailSent: - return html`
    ${msg("Email info:")}
    -
    ${this.getEmailInfo(this.event.context)}
    - - - `; - case EventActions.SecretView: - return html`
    ${msg("Secret:")}
    - ${this.getModelInfo(this.event.context.secret as EventModel)}`; - case EventActions.SystemException: - return html` - ${msg("Open issue on GitHub...")} - -
    -
    -
    ${msg("Exception")}
    -
    -
    ${this.event.context.message}
    -
    -
    -
    - ${this.defaultResponse()}`; - case EventActions.PropertyMappingException: - return html`
    -
    -
    ${msg("Exception")}
    -
    -
    ${this.event.context.message || this.event.context.error}
    -
    -
    -
    -
    ${msg("Expression")}
    -
    - ${this.event.context.expression} -
    -
    -
    - ${this.defaultResponse()}`; - case EventActions.PolicyException: - return html`
    -
    -
    ${msg("Binding")}
    - ${this.getModelInfo(this.event.context.binding as EventModel)} -
    -
    -
    ${msg("Request")}
    -
    -
      -
    • - ${msg("Object")}: - ${this.getModelInfo( - (this.event.context.request as EventContext) - .obj as EventModel, - )} -
    • -
    • - ${msg("Context")}: - ${JSON.stringify( - (this.event.context.request as EventContext) - .context, - null, - 4, - )} -
    • -
    -
    -
    -
    -
    ${msg("Exception")}
    -
    - ${this.event.context.message || this.event.context.error} -
    -
    -
    - ${this.defaultResponse()}`; - case EventActions.PolicyExecution: - return html`
    -
    -
    ${msg("Binding")}
    - ${this.getModelInfo(this.event.context.binding as EventModel)} -
    -
    -
    ${msg("Request")}
    -
    -
      -
    • - ${msg("Object")}: - ${this.getModelInfo( - (this.event.context.request as EventContext) - .obj as EventModel, - )} -
    • -
    • - ${msg("Context")}: - ${JSON.stringify( - (this.event.context.request as EventContext) - .context, - null, - 4, - )} -
    • -
    -
    -
    -
    -
    ${msg("Result")}
    -
    -
      -
    • - ${msg("Passing")}: - ${(this.event.context.result as EventContext).passing} -
    • -
    • - ${msg("Messages")}: -
        - ${( - (this.event.context.result as EventContext) - .messages as string[] - ).map((msg) => { - return html`
      • ${msg}
      • `; - })} -
      -
    • -
    -
    -
    -
    - ${this.defaultResponse()}`; - case EventActions.ConfigurationError: - return html`
    ${this.event.context.message}
    - ${this.defaultResponse()}`; - case EventActions.UpdateAvailable: - return html`
    ${msg("New version available!")}
    - - ${this.event.context.new_version} - `; - // Action types which typically don't record any extra context. - // If context is not empty, we fall to the default response. - case EventActions.Login: - if ("using_source" in this.event.context) { - return html`
    -
    -
    ${msg("Using source")}
    - ${this.getModelInfo(this.event.context.using_source as EventModel)} -
    -
    `; - } - return this.defaultResponse(); - case EventActions.LoginFailed: - return html`
    - ${msg(str`Attempted to log in as ${this.event.context.username}`)} -
    - ${this.defaultResponse()}`; - case EventActions.Logout: - if (Object.keys(this.event.context).length === 0) { - return html`${msg("No additional data available.")}`; - } - return this.defaultResponse(); - case EventActions.SystemTaskException: - return html`
    -
    -
    ${msg("Exception")}
    -
    -
    ${this.event.context.message}
    -
    -
    -
    `; - default: - return this.defaultResponse(); - } - } -} diff --git a/web/src/admin/events/EventListPage.ts b/web/src/admin/events/EventListPage.ts index 83e11b9b9..4d42e8c74 100644 --- a/web/src/admin/events/EventListPage.ts +++ b/web/src/admin/events/EventListPage.ts @@ -1,8 +1,9 @@ -import "@goauthentik/admin/events/EventInfo"; -import { ActionToLabel, EventGeo } from "@goauthentik/admin/events/utils"; +import { EventGeo } from "@goauthentik/admin/events/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EventWithContext } from "@goauthentik/common/events"; +import { actionToLabel } from "@goauthentik/common/labels"; import { uiConfig } from "@goauthentik/common/ui/config"; +import "@goauthentik/components/ak-event-info"; import { PaginatedResponse } from "@goauthentik/elements/table/Table"; import { TableColumn } from "@goauthentik/elements/table/Table"; import { TablePage } from "@goauthentik/elements/table/TablePage"; @@ -56,7 +57,7 @@ export class EventListPage extends TablePage { row(item: EventWithContext): TemplateResult[] { return [ - html`
    ${ActionToLabel(item.action)}
    + html`
    ${actionToLabel(item.action)}
    ${item.app}`, item.user?.username ? html`
    diff --git a/web/src/admin/events/EventViewPage.ts b/web/src/admin/events/EventViewPage.ts index 77479d215..b5351840a 100644 --- a/web/src/admin/events/EventViewPage.ts +++ b/web/src/admin/events/EventViewPage.ts @@ -1,7 +1,8 @@ -import "@goauthentik/admin/events/EventInfo"; -import { ActionToLabel, EventGeo } from "@goauthentik/admin/events/utils"; +import { EventGeo } from "@goauthentik/admin/events/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EventWithContext } from "@goauthentik/common/events"; +import { actionToLabel } from "@goauthentik/common/labels"; +import "@goauthentik/components/ak-event-info"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/PageHeader"; @@ -62,7 +63,7 @@ export class EventViewPage extends AKElement {
    - ${ActionToLabel(this.event.action)} + ${actionToLabel(this.event.action)}
    diff --git a/web/src/admin/events/RuleForm.ts b/web/src/admin/events/RuleForm.ts index d69a62035..b0d0c017c 100644 --- a/web/src/admin/events/RuleForm.ts +++ b/web/src/admin/events/RuleForm.ts @@ -1,5 +1,5 @@ -import { SeverityToLabel } from "@goauthentik/admin/events/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { severityToLabel } from "@goauthentik/common/labels"; import "@goauthentik/elements/forms/HorizontalFormElement"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; import "@goauthentik/elements/forms/Radio"; @@ -125,16 +125,16 @@ export class RuleForm extends ModelForm { { row(item: NotificationRule): TemplateResult[] { return [ html`${item.name}`, - html`${SeverityToLabel(item.severity)}`, + html`${severityToLabel(item.severity)}`, html`${item.groupObj ? html`${item.groupObj.name}` : msg("None (rule disabled)")}`, diff --git a/web/src/admin/events/utils.ts b/web/src/admin/events/utils.ts index 5f5563ddd..d6aac8e3a 100644 --- a/web/src/admin/events/utils.ts +++ b/web/src/admin/events/utils.ts @@ -1,11 +1,8 @@ import { EventWithContext } from "@goauthentik/common/events"; import { KeyUnknown } from "@goauthentik/elements/forms/Form"; -import { msg } from "@lit/localize"; import { TemplateResult, html } from "lit"; -import { EventActions, SeverityEnum } from "@goauthentik/api"; - export function EventGeo(event: EventWithContext): TemplateResult { let geo: KeyUnknown | undefined = undefined; if (Object.hasOwn(event.context, "geo")) { @@ -17,76 +14,3 @@ export function EventGeo(event: EventWithContext): TemplateResult { } return html``; } - -export function ActionToLabel(action?: EventActions): string { - if (!action) return ""; - switch (action) { - case EventActions.Login: - return msg("Login"); - case EventActions.LoginFailed: - return msg("Failed login"); - case EventActions.Logout: - return msg("Logout"); - case EventActions.UserWrite: - return msg("User was written to"); - case EventActions.SuspiciousRequest: - return msg("Suspicious request"); - case EventActions.PasswordSet: - return msg("Password set"); - case EventActions.SecretView: - return msg("Secret was viewed"); - case EventActions.SecretRotate: - return msg("Secret was rotated"); - case EventActions.InvitationUsed: - return msg("Invitation used"); - case EventActions.AuthorizeApplication: - return msg("Application authorized"); - case EventActions.SourceLinked: - return msg("Source linked"); - case EventActions.ImpersonationStarted: - return msg("Impersonation started"); - case EventActions.ImpersonationEnded: - return msg("Impersonation ended"); - case EventActions.FlowExecution: - return msg("Flow execution"); - case EventActions.PolicyExecution: - return msg("Policy execution"); - case EventActions.PolicyException: - return msg("Policy exception"); - case EventActions.PropertyMappingException: - return msg("Property Mapping exception"); - case EventActions.SystemTaskExecution: - return msg("System task execution"); - case EventActions.SystemTaskException: - return msg("System task exception"); - case EventActions.SystemException: - return msg("General system exception"); - case EventActions.ConfigurationError: - return msg("Configuration error"); - case EventActions.ModelCreated: - return msg("Model created"); - case EventActions.ModelUpdated: - return msg("Model updated"); - case EventActions.ModelDeleted: - return msg("Model deleted"); - case EventActions.EmailSent: - return msg("Email sent"); - case EventActions.UpdateAvailable: - return msg("Update available"); - default: - return action; - } -} - -export function SeverityToLabel(severity: SeverityEnum | null | undefined): string { - if (!severity) return msg("Unknown severity"); - switch (severity) { - case SeverityEnum.Alert: - return msg("Alert"); - case SeverityEnum.Notice: - return msg("Notice"); - case SeverityEnum.Warning: - return msg("Warning"); - } - return msg("Unknown severity"); -} diff --git a/web/src/admin/flows/BoundStagesList.ts b/web/src/admin/flows/BoundStagesList.ts index f682dfc05..9394145e4 100644 --- a/web/src/admin/flows/BoundStagesList.ts +++ b/web/src/admin/flows/BoundStagesList.ts @@ -142,7 +142,7 @@ export class BoundStagesList extends Table { renderToolbar(): TemplateResult { return html` diff --git a/web/src/admin/flows/FlowViewPage.ts b/web/src/admin/flows/FlowViewPage.ts index a6448678b..ee88ff2e3 100644 --- a/web/src/admin/flows/FlowViewPage.ts +++ b/web/src/admin/flows/FlowViewPage.ts @@ -3,11 +3,11 @@ import "@goauthentik/admin/flows/FlowDiagram"; import "@goauthentik/admin/flows/FlowForm"; import "@goauthentik/admin/policies/BoundPoliciesList"; import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/PageHeader"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, css, html } from "lit"; diff --git a/web/src/admin/groups/GroupViewPage.ts b/web/src/admin/groups/GroupViewPage.ts index 33d89b88f..0cbdcee5e 100644 --- a/web/src/admin/groups/GroupViewPage.ts +++ b/web/src/admin/groups/GroupViewPage.ts @@ -2,6 +2,7 @@ import "@goauthentik/admin/groups/GroupForm"; import "@goauthentik/admin/users/RelatedUserList"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import { PFColor } from "@goauthentik/elements/Label"; @@ -9,7 +10,6 @@ import "@goauthentik/elements/PageHeader"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/forms/ModalForm"; import { msg, str } from "@lit/localize"; diff --git a/web/src/admin/policies/BoundPoliciesList.ts b/web/src/admin/policies/BoundPoliciesList.ts index acf8b2ce7..8a7dffc2b 100644 --- a/web/src/admin/policies/BoundPoliciesList.ts +++ b/web/src/admin/policies/BoundPoliciesList.ts @@ -194,7 +194,7 @@ export class BoundPoliciesList extends Table { renderToolbar(): TemplateResult { return html` diff --git a/web/src/admin/policies/PolicyBindingForm.ts b/web/src/admin/policies/PolicyBindingForm.ts index 458210edf..7de9d66f0 100644 --- a/web/src/admin/policies/PolicyBindingForm.ts +++ b/web/src/admin/policies/PolicyBindingForm.ts @@ -3,6 +3,7 @@ import { first, groupBy } from "@goauthentik/common/utils"; import "@goauthentik/components/ak-toggle-group"; import "@goauthentik/elements/forms/HorizontalFormElement"; import { ModelForm } from "@goauthentik/elements/forms/ModelForm"; +import "@goauthentik/elements/forms/Radio"; import "@goauthentik/elements/forms/SearchSelect"; import { msg } from "@lit/localize"; @@ -298,6 +299,26 @@ export class PolicyBindingForm extends ModelForm { required /> + + + +

    + ${msg("Result used when policy execution fails.")} +

    +
    `; } } diff --git a/web/src/admin/policies/reputation/ReputationPolicyForm.ts b/web/src/admin/policies/reputation/ReputationPolicyForm.ts index 4d6088fb3..33903caab 100644 --- a/web/src/admin/policies/reputation/ReputationPolicyForm.ts +++ b/web/src/admin/policies/reputation/ReputationPolicyForm.ts @@ -93,7 +93,7 @@ doesn't pass when either or both of the selected options are equal or above the diff --git a/web/src/admin/providers/ldap/LDAPProviderViewPage.ts b/web/src/admin/providers/ldap/LDAPProviderViewPage.ts index 6693ee8d6..f644bb7c5 100644 --- a/web/src/admin/providers/ldap/LDAPProviderViewPage.ts +++ b/web/src/admin/providers/ldap/LDAPProviderViewPage.ts @@ -3,12 +3,12 @@ import "@goauthentik/admin/providers/ldap/LDAPProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { me } from "@goauthentik/common/users"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts b/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts index e20c63d9a..8ffb8ebef 100644 --- a/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts +++ b/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts @@ -248,8 +248,13 @@ export class OAuth2ProviderFormPage extends ModelForm { >>>>>> main >

    ${msg("Key used to sign the tokens.")}

    diff --git a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts index cefc5b959..920e71ceb 100644 --- a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts +++ b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts @@ -3,6 +3,7 @@ import "@goauthentik/admin/providers/oauth2/OAuth2ProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { convertToTitle } from "@goauthentik/common/utils"; +import "@goauthentik/components/events/ObjectChangelog"; import MDProviderOAuth2 from "@goauthentik/docs/providers/oauth2/index.md"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; @@ -11,7 +12,6 @@ import "@goauthentik/elements/Markdown"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/admin/providers/proxy/ProxyProviderViewPage.ts b/web/src/admin/providers/proxy/ProxyProviderViewPage.ts index 91c50f546..2451cfa1e 100644 --- a/web/src/admin/providers/proxy/ProxyProviderViewPage.ts +++ b/web/src/admin/providers/proxy/ProxyProviderViewPage.ts @@ -3,6 +3,7 @@ import "@goauthentik/admin/providers/proxy/ProxyProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { convertToSlug } from "@goauthentik/common/utils"; +import "@goauthentik/components/events/ObjectChangelog"; import MDCaddyStandalone from "@goauthentik/docs/providers/proxy/_caddy_standalone.md"; import MDNginxIngress from "@goauthentik/docs/providers/proxy/_nginx_ingress.md"; import MDNginxPM from "@goauthentik/docs/providers/proxy/_nginx_proxy_manager.md"; @@ -20,7 +21,6 @@ import { Replacer } from "@goauthentik/elements/Markdown"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { getURLParam } from "@goauthentik/elements/router/RouteMatch"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/providers/radius/RadiusProviderViewPage.ts b/web/src/admin/providers/radius/RadiusProviderViewPage.ts index e181766fc..b62600a97 100644 --- a/web/src/admin/providers/radius/RadiusProviderViewPage.ts +++ b/web/src/admin/providers/radius/RadiusProviderViewPage.ts @@ -2,12 +2,12 @@ import "@goauthentik/admin/providers/RelatedApplicationButton"; import "@goauthentik/admin/providers/radius/RadiusProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/admin/providers/saml/SAMLProviderViewPage.ts b/web/src/admin/providers/saml/SAMLProviderViewPage.ts index 82fccf1a9..3e8d773ef 100644 --- a/web/src/admin/providers/saml/SAMLProviderViewPage.ts +++ b/web/src/admin/providers/saml/SAMLProviderViewPage.ts @@ -3,6 +3,7 @@ import "@goauthentik/admin/providers/saml/SAMLProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { MessageLevel } from "@goauthentik/common/messages"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/EmptyState"; @@ -10,7 +11,6 @@ import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { showMessage } from "@goauthentik/elements/messages/MessageContainer"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/providers/scim/SCIMProviderViewPage.ts b/web/src/admin/providers/scim/SCIMProviderViewPage.ts index 72174836f..8a4d7fe0b 100644 --- a/web/src/admin/providers/scim/SCIMProviderViewPage.ts +++ b/web/src/admin/providers/scim/SCIMProviderViewPage.ts @@ -1,13 +1,13 @@ import "@goauthentik/admin/providers/scim/SCIMProviderForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import MDSCIMProvider from "@goauthentik/docs/providers/scim/index.md"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/Markdown"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/ModalButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import { msg } from "@lit/localize"; import { CSSResult, TemplateResult, html } from "lit"; diff --git a/web/src/admin/sources/SourceListPage.ts b/web/src/admin/sources/SourceListPage.ts index 6a95116af..5e627e7c9 100644 --- a/web/src/admin/sources/SourceListPage.ts +++ b/web/src/admin/sources/SourceListPage.ts @@ -24,7 +24,7 @@ import { Source, SourcesApi } from "@goauthentik/api"; @customElement("ak-source-list") export class SourceListPage extends TablePage { pageTitle(): string { - return msg("Federation & Social login"); + return msg("Federation and Social login"); } pageDescription(): string | undefined { return msg( diff --git a/web/src/admin/sources/SourceViewPage.ts b/web/src/admin/sources/SourceViewPage.ts index 3c010bdb0..d0050fdf9 100644 --- a/web/src/admin/sources/SourceViewPage.ts +++ b/web/src/admin/sources/SourceViewPage.ts @@ -14,18 +14,6 @@ import { ifDefined } from "lit/directives/if-defined.js"; import { Source, SourcesApi } from "@goauthentik/api"; -export function renderSourceIcon(name: string, iconUrl: string | undefined | null): TemplateResult { - const icon = html``; - if (iconUrl) { - if (iconUrl.startsWith("fa://")) { - const url = iconUrl.replaceAll("fa://", ""); - return html``; - } - return html`${name}`; - } - return icon; -} - @customElement("ak-source-view") export class SourceViewPage extends AKElement { @property({ type: String }) diff --git a/web/src/admin/sources/ldap/LDAPSourceViewPage.ts b/web/src/admin/sources/ldap/LDAPSourceViewPage.ts index 84bd662b4..2c74bc5f2 100644 --- a/web/src/admin/sources/ldap/LDAPSourceViewPage.ts +++ b/web/src/admin/sources/ldap/LDAPSourceViewPage.ts @@ -1,12 +1,12 @@ import "@goauthentik/admin/sources/ldap/LDAPSourceForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/forms/ModalForm"; import { msg, str } from "@lit/localize"; diff --git a/web/src/admin/sources/oauth/OAuthSourceViewPage.ts b/web/src/admin/sources/oauth/OAuthSourceViewPage.ts index fba2c7eee..3bfa5cdaf 100644 --- a/web/src/admin/sources/oauth/OAuthSourceViewPage.ts +++ b/web/src/admin/sources/oauth/OAuthSourceViewPage.ts @@ -3,11 +3,11 @@ import "@goauthentik/admin/sources/oauth/OAuthSourceDiagram"; import "@goauthentik/admin/sources/oauth/OAuthSourceForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/forms/ModalForm"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/sources/plex/PlexSourceViewPage.ts b/web/src/admin/sources/plex/PlexSourceViewPage.ts index f18f5a81f..51db79d27 100644 --- a/web/src/admin/sources/plex/PlexSourceViewPage.ts +++ b/web/src/admin/sources/plex/PlexSourceViewPage.ts @@ -2,11 +2,11 @@ import "@goauthentik/admin/policies/BoundPoliciesList"; import "@goauthentik/admin/sources/plex/PlexSourceForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/forms/ModalForm"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/sources/saml/SAMLSourceViewPage.ts b/web/src/admin/sources/saml/SAMLSourceViewPage.ts index ccf197f21..b85768242 100644 --- a/web/src/admin/sources/saml/SAMLSourceViewPage.ts +++ b/web/src/admin/sources/saml/SAMLSourceViewPage.ts @@ -2,11 +2,11 @@ import "@goauthentik/admin/policies/BoundPoliciesList"; import "@goauthentik/admin/sources/saml/SAMLSourceForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; +import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; import "@goauthentik/elements/forms/ModalForm"; import { msg } from "@lit/localize"; diff --git a/web/src/admin/sources/utils.ts b/web/src/admin/sources/utils.ts new file mode 100644 index 000000000..83ff0b967 --- /dev/null +++ b/web/src/admin/sources/utils.ts @@ -0,0 +1,13 @@ +import { TemplateResult, html } from "lit"; + +export function renderSourceIcon(name: string, iconUrl: string | undefined | null): TemplateResult { + const icon = html``; + if (iconUrl) { + if (iconUrl.startsWith("fa://")) { + const url = iconUrl.replaceAll("fa://", ""); + return html``; + } + return html`${name}`; + } + return icon; +} diff --git a/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts b/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts index fb6ccb6c5..0ab4afbaf 100644 --- a/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts +++ b/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts @@ -96,18 +96,18 @@ export class AuthenticateWebAuthnStageForm extends ModelForm { searchEnabled(): boolean { @@ -121,7 +107,7 @@ export class TokenListPage extends TablePage { ${item.expiring ? msg("Yes") : msg("No")} `, html`${item.expiring ? item.expires?.toLocaleString() : msg("-")}`, - html`${IntentToLabel(item.intent || IntentEnum.Api)}`, + html`${intentToLabel(item.intent ?? IntentEnum.Api)}`, html` ${!item.managed ? html` diff --git a/web/src/elements/user/UserDevicesList.ts b/web/src/admin/users/UserDevicesList.ts similarity index 62% rename from web/src/elements/user/UserDevicesList.ts rename to web/src/admin/users/UserDevicesList.ts index 3e43d5547..6db5af610 100644 --- a/web/src/elements/user/UserDevicesList.ts +++ b/web/src/admin/users/UserDevicesList.ts @@ -1,8 +1,8 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { deviceTypeName } from "@goauthentik/common/labels"; import "@goauthentik/elements/forms/DeleteBulkForm"; import { PaginatedResponse } from "@goauthentik/elements/table/Table"; -import { TableColumn } from "@goauthentik/elements/table/Table"; -import { MFADevicesPage, deviceTypeName } from "@goauthentik/user/user-settings/mfa/MFADevicesPage"; +import { Table, TableColumn } from "@goauthentik/elements/table/Table"; import { msg } from "@lit/localize"; import { TemplateResult, html } from "lit"; @@ -11,7 +11,7 @@ import { customElement, property } from "lit/decorators.js"; import { AuthenticatorsApi, Device } from "@goauthentik/api"; @customElement("ak-user-device-list") -export class UserDeviceList extends MFADevicesPage { +export class UserDeviceList extends Table { @property({ type: Number }) userId?: number; @@ -36,41 +36,34 @@ export class UserDeviceList extends MFADevicesPage { }); } + columns(): TableColumn[] { + // prettier-ignore + return [ + msg("Name"), + msg("Type"), + msg("Confirmed") + ].map((th) => new TableColumn(th, "")); + } + async deleteWrapper(device: Device) { + const api = new AuthenticatorsApi(DEFAULT_CONFIG); + const id = { id: device.pk }; switch (device.type) { case "authentik_stages_authenticator_duo.DuoDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsAdminDuoDestroy({ - id: device.pk, - }); + return api.authenticatorsAdminDuoDestroy(id); case "authentik_stages_authenticator_sms.SMSDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsAdminSmsDestroy({ - id: device.pk, - }); - case "otp_totp.TOTPDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsAdminTotpDestroy({ - id: device.pk, - }); - case "otp_static.StaticDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsAdminStaticDestroy({ - id: device.pk, - }); + return api.authenticatorsAdminSmsDestroy(id); + case "authentik_stages_authenticator_totp.TOTPDevice": + return api.authenticatorsAdminTotpDestroy(id); + case "authentik_stages_authenticator_static.StaticDevice": + return api.authenticatorsAdminStaticDestroy(id); case "authentik_stages_authenticator_webauthn.WebAuthnDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsAdminWebauthnDestroy({ - id: device.pk, - }); + return api.authenticatorsAdminWebauthnDestroy(id); default: break; } } - columns(): TableColumn[] { - return [ - new TableColumn(msg("Name"), ""), - new TableColumn(msg("Type"), ""), - new TableColumn(msg("Confirmed"), ""), - ]; - } - renderToolbar(): TemplateResult { return html` { diff --git a/web/src/admin/users/UserViewPage.ts b/web/src/admin/users/UserViewPage.ts index 60e62c0c8..9f0dd1731 100644 --- a/web/src/admin/users/UserViewPage.ts +++ b/web/src/admin/users/UserViewPage.ts @@ -6,6 +6,8 @@ import "@goauthentik/admin/users/UserPasswordForm"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { MessageLevel } from "@goauthentik/common/messages"; +import "@goauthentik/components/events/ObjectChangelog"; +import "@goauthentik/components/events/UserEvents"; import { AKElement, rootInterface } from "@goauthentik/elements/Base"; import "@goauthentik/elements/CodeMirror"; import { PFColor } from "@goauthentik/elements/Label"; @@ -14,17 +16,14 @@ import { PFSize } from "@goauthentik/elements/Spinner"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/ActionButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import "@goauthentik/elements/events/ObjectChangelog"; -import "@goauthentik/elements/events/UserEvents"; import "@goauthentik/elements/forms/ModalForm"; import { showMessage } from "@goauthentik/elements/messages/MessageContainer"; import "@goauthentik/elements/oauth/UserRefreshList"; import "@goauthentik/elements/user/SessionList"; import "@goauthentik/elements/user/UserConsentList"; -import "@goauthentik/elements/user/UserDevicesList"; import { msg, str } from "@lit/localize"; -import { CSSResult, TemplateResult, html } from "lit"; +import { CSSResult, TemplateResult, css, html } from "lit"; import { customElement, property } from "lit/decorators.js"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; @@ -40,6 +39,8 @@ import PFSizing from "@patternfly/patternfly/utilities/Sizing/sizing.css"; import { CapabilitiesEnum, CoreApi, User } from "@goauthentik/api"; +import "./UserDevicesList"; + @customElement("ak-user-view") export class UserViewPage extends AKElement { @property({ type: Number }) @@ -68,6 +69,15 @@ export class UserViewPage extends AKElement { PFCard, PFDescriptionList, PFSizing, + css` + .pf-c-description-list__description ak-action-button { + margin-right: 6px; + margin-bottom: 6px; + } + .ak-button-collection { + max-width: 12em; + } + `, ]; } @@ -89,6 +99,221 @@ export class UserViewPage extends AKElement { ${this.renderBody()}`; } + renderUserCard(): TemplateResult { + if (!this.user) { + return html``; + } + return html` +
    ${msg("User Info")}
    +
    +
    +
    +
    + ${msg("Username")} +
    +
    +
    ${this.user.username}
    +
    +
    +
    +
    + ${msg("Name")} +
    +
    +
    ${this.user.name}
    +
    +
    +
    +
    + ${msg("Email")} +
    +
    +
    ${this.user.email || "-"}
    +
    +
    +
    +
    + ${msg("Last login")} +
    +
    +
    + ${this.user.lastLogin?.toLocaleString()} +
    +
    +
    +
    +
    + ${msg("Active")} +
    +
    +
    + +
    +
    +
    +
    +
    + ${msg("Superuser")} +
    +
    +
    + +
    +
    +
    +
    +
    + ${msg("Actions")} +
    +
    +
    + + ${msg("Update")} + ${msg("Update User")} + + + + + { + return new CoreApi(DEFAULT_CONFIG).coreUsersPartialUpdate({ + id: this.user?.pk || 0, + patchedUserRequest: { + isActive: !this.user?.isActive, + }, + }); + }} + > + + + ${rootInterface()?.config?.capabilities.includes( + CapabilitiesEnum.CanImpersonate, + ) + ? html` + { + return new CoreApi(DEFAULT_CONFIG) + .coreUsersImpersonateCreate({ + id: this.user?.pk || 0, + }) + .then(() => { + window.location.href = "/"; + }); + }} + > + + ${msg("Impersonate")} + + + ` + : html``} +
    +
    +
    +
    +
    + ${msg("Recovery")} +
    +
    +
    + + ${msg("Update password")} + ${msg("Update password")} + + + + { + return new CoreApi(DEFAULT_CONFIG) + .coreUsersRecoveryRetrieve({ + id: this.user?.pk || 0, + }) + .then((rec) => { + showMessage({ + level: MessageLevel.success, + message: msg( + "Successfully generated recovery link", + ), + description: rec.link, + }); + }) + .catch(() => { + showMessage({ + level: MessageLevel.error, + message: msg( + "To create a recovery link, the current tenant needs to have a recovery flow configured.", + ), + description: "", + }); + }); + }} + > + + ${msg("Reset Password")} + + +
    +
    +
    +
    +
    + `; + } + renderBody(): TemplateResult { if (!this.user) { return html``; @@ -103,186 +328,7 @@ export class UserViewPage extends AKElement {
    -
    ${msg("User Info")}
    -
    -
    -
    -
    - ${msg("Username")} -
    -
    -
    - ${this.user.username} -
    -
    -
    -
    -
    - ${msg("Name")} -
    -
    -
    - ${this.user.name} -
    -
    -
    -
    -
    - ${msg("Email")} -
    -
    -
    - ${this.user.email || "-"} -
    -
    -
    -
    -
    - ${msg("Last login")} -
    -
    -
    - ${this.user.lastLogin?.toLocaleString()} -
    -
    -
    -
    -
    - ${msg("Active")} -
    -
    -
    - -
    -
    -
    -
    -
    - ${msg("Superuser")} -
    -
    -
    - -
    -
    -
    -
    -
    - - ${rootInterface()?.config?.capabilities.includes( - CapabilitiesEnum.CanImpersonate, - ) - ? html` - - ` - : html``} - - - + ${this.renderUserCard()}
    | undefined = Promise.resolve(globalAK().tenant); diff --git a/web/src/common/constants.ts b/web/src/common/constants.ts index cd5c58e2a..ca6ce33a1 100644 --- a/web/src/common/constants.ts +++ b/web/src/common/constants.ts @@ -3,7 +3,7 @@ export const SUCCESS_CLASS = "pf-m-success"; export const ERROR_CLASS = "pf-m-danger"; export const PROGRESS_CLASS = "pf-m-in-progress"; export const CURRENT_CLASS = "pf-m-current"; -export const VERSION = "2023.8.1"; +export const VERSION = "2023.8.3"; export const TITLE_DEFAULT = "authentik"; export const ROUTE_SEPARATOR = ";"; diff --git a/web/src/common/labels.ts b/web/src/common/labels.ts new file mode 100644 index 000000000..f2d9d1376 --- /dev/null +++ b/web/src/common/labels.ts @@ -0,0 +1,67 @@ +import { msg } from "@lit/localize"; + +import { Device, EventActions, IntentEnum, SeverityEnum } from "@goauthentik/api"; + +/* Various tables in the API for which we need to supply labels */ + +export const intentEnumToLabel = new Map([ + [IntentEnum.Api, msg("API Access")], + [IntentEnum.AppPassword, msg("App password")], + [IntentEnum.Recovery, msg("Recovery")], + [IntentEnum.Verification, msg("Verification")], + [IntentEnum.UnknownDefaultOpenApi, msg("Unknown intent")], +]); + +export const intentToLabel = (intent: IntentEnum) => intentEnumToLabel.get(intent); + +export const eventActionToLabel = new Map([ + [EventActions.Login, msg("Login")], + [EventActions.LoginFailed, msg("Failed login")], + [EventActions.Logout, msg("Logout")], + [EventActions.UserWrite, msg("User was written to")], + [EventActions.SuspiciousRequest, msg("Suspicious request")], + [EventActions.PasswordSet, msg("Password set")], + [EventActions.SecretView, msg("Secret was viewed")], + [EventActions.SecretRotate, msg("Secret was rotated")], + [EventActions.InvitationUsed, msg("Invitation used")], + [EventActions.AuthorizeApplication, msg("Application authorized")], + [EventActions.SourceLinked, msg("Source linked")], + [EventActions.ImpersonationStarted, msg("Impersonation started")], + [EventActions.ImpersonationEnded, msg("Impersonation ended")], + [EventActions.FlowExecution, msg("Flow execution")], + // These are different: look closely. + [EventActions.PolicyExecution, msg("Policy execution")], + [EventActions.PolicyException, msg("Policy exception")], + [EventActions.PropertyMappingException, msg("Property Mapping exception")], + // These are different: look closely. + [EventActions.SystemTaskExecution, msg("System task execution")], + [EventActions.SystemTaskException, msg("System task exception")], + [EventActions.SystemException, msg("General system exception")], + [EventActions.ConfigurationError, msg("Configuration error")], + [EventActions.ModelCreated, msg("Model created")], + [EventActions.ModelUpdated, msg("Model updated")], + [EventActions.ModelDeleted, msg("Model deleted")], + [EventActions.EmailSent, msg("Email sent")], + [EventActions.UpdateAvailable, msg("Update available")], +]); + +export const actionToLabel = (action?: EventActions): string => + eventActionToLabel.get(action) ?? action ?? ""; + +export const severityEnumToLabel = new Map([ + [SeverityEnum.Alert, msg("Alert")], + [SeverityEnum.Notice, msg("Notice")], + [SeverityEnum.Warning, msg("Warning")], +]); + +export const severityToLabel = (severity: SeverityEnum | null | undefined) => + severityEnumToLabel.get(severity) ?? msg("Unknown severity"); + +// TODO: Add verbose_name field to now vendored OTP devices +export const deviceTypeToLabel = new Map([ + ["authentik_stages_authenticator_static.StaticDevice", msg("Static tokens")], + ["authentik_stages_authenticator_totp.TOTPDevice", msg("TOTP Device")], +]); + +export const deviceTypeName = (device: Device) => + deviceTypeToLabel.get(device.type) ?? device?.verboseName ?? ""; diff --git a/web/src/common/users.ts b/web/src/common/users.ts index 02e269895..5378236ce 100644 --- a/web/src/common/users.ts +++ b/web/src/common/users.ts @@ -1,6 +1,5 @@ import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_LOCALE_REQUEST } from "@goauthentik/common/constants"; -import { customEvent } from "@goauthentik/elements/utils/customEvents"; import { CoreApi, ResponseError, SessionUser } from "@goauthentik/api"; @@ -24,7 +23,13 @@ export function me(): Promise { console.debug( `authentik/locale: Activating user's configured locale '${locale}'`, ); - window.dispatchEvent(customEvent(EVENT_LOCALE_REQUEST, { locale })); + window.dispatchEvent( + new CustomEvent(EVENT_LOCALE_REQUEST, { + composed: true, + bubbles: true, + detail: { locale }, + }), + ); } return user; }) diff --git a/web/src/user/LibraryApplication/AppIcon.ts b/web/src/components/ak-app-icon.ts similarity index 99% rename from web/src/user/LibraryApplication/AppIcon.ts rename to web/src/components/ak-app-icon.ts index fdefcf65a..5af288ad8 100644 --- a/web/src/user/LibraryApplication/AppIcon.ts +++ b/web/src/components/ak-app-icon.ts @@ -81,3 +81,5 @@ export class AppIcon extends AKElement { return html`${this.app?.name.charAt(0).toUpperCase()}`; } } + +export default AppIcon; diff --git a/web/src/components/ak-event-info.ts b/web/src/components/ak-event-info.ts new file mode 100644 index 000000000..6901f31a8 --- /dev/null +++ b/web/src/components/ak-event-info.ts @@ -0,0 +1,491 @@ +import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { VERSION } from "@goauthentik/common/constants"; +import { EventContext, EventModel, EventWithContext } from "@goauthentik/common/events"; +import { AKElement } from "@goauthentik/elements/Base"; +import "@goauthentik/elements/Expand"; +import "@goauthentik/elements/Spinner"; +import { PFSize } from "@goauthentik/elements/Spinner"; + +import { msg, str } from "@lit/localize"; +import { CSSResult, TemplateResult, css, html } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { map } from "lit/directives/map.js"; +import { until } from "lit/directives/until.js"; + +import PFButton from "@patternfly/patternfly/components/Button/button.css"; +import PFCard from "@patternfly/patternfly/components/Card/card.css"; +import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css"; +import PFList from "@patternfly/patternfly/components/List/list.css"; +import PFFlex from "@patternfly/patternfly/layouts/Flex/flex.css"; +import PFBase from "@patternfly/patternfly/patternfly-base.css"; + +import { EventActions, FlowsApi } from "@goauthentik/api"; + +type Pair = [string, string | number | EventContext | EventModel | string[] | TemplateResult]; + +// https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-issues/about-automation-for-issues-and-pull-requests-with-query-parameters + +// This is the template message body with our stacktrace passed to github via a querystring. It is +// 702 bytes long in UTF-8. [As of July +// 2023](https://saturncloud.io/blog/what-is-the-maximum-length-of-a-url-in-different-browsers/), +// the longest URL (not query string, **URL**) passable via this method is 2048 bytes. This is a bit +// of a hack, but it will get the top of the context across even if it exceeds the limit of the more +// restrictive browsers. + +const githubIssueMessageBody = (context: EventContext) => ` +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Logs** +
    + Stacktrace from authentik + +\`\`\` +${context.message as string} +\`\`\` +
    + + +**Version and Deployment (please complete the following information):** +- authentik version: ${VERSION} +- Deployment: [e.g. docker-compose, helm] + +**Additional context** +Add any other context about the problem here. + `; + +@customElement("ak-event-info") +export class EventInfo extends AKElement { + @property({ attribute: false }) + event!: EventWithContext; + + static get styles(): CSSResult[] { + return [ + PFBase, + PFButton, + PFFlex, + PFCard, + PFList, + PFDescriptionList, + css` + code { + display: block; + white-space: pre-wrap; + word-break: break-all; + } + .pf-l-flex { + justify-content: space-between; + } + .pf-l-flex__item { + min-width: 25%; + } + iframe { + width: 100%; + height: 50rem; + } + `, + ]; + } + + renderDescriptionGroup([term, description]: Pair) { + return html`
    +
    + ${term} +
    +
    +
    ${description}
    +
    +
    `; + } + + getModelInfo(context: EventModel): TemplateResult { + if (context === null) { + return html`-`; + } + + const modelFields: Pair[] = [ + [msg("UID"), context.pk], + [msg("Name"), context.name], + [msg("App"), context.app], + [msg("Model Name"), context.model_name], + ]; + + return html`
    +
    + ${map(modelFields, this.renderDescriptionGroup)} +
    +
    `; + } + + getEmailInfo(context: EventContext): TemplateResult { + if (context === null) { + return html`-`; + } + + // prettier-ignore + const emailFields: Pair[] = [ + [msg("Message"), context.message], + [msg("Subject"), context.subject], + [msg("From"), context.from_email], + [msg("To"), html`${(context.to_email as string[]).map((to) => { + return html`
  • ${to}
  • `; + })}`], + ]; + + return html`
    + ${map(emailFields, this.renderDescriptionGroup)} +
    `; + } + + renderDefaultResponse(): TemplateResult { + return html`
    +
    +
    ${msg("Context")}
    +
    + ${JSON.stringify(this.event?.context, null, 4)} +
    +
    +
    +
    ${msg("User")}
    +
    + ${JSON.stringify(this.event?.user, null, 4)} +
    +
    +
    `; + } + + buildGitHubIssueUrl(context: EventContext): string { + const httpRequest = this.event.context.http_request as EventContext; + const title = httpRequest ? `${httpRequest?.method} ${httpRequest?.path}` : ""; + + return [ + "https://github.com/goauthentik/authentik/issues/new", + "?labels=bug,from_authentik", + `&title=${encodeURIComponent(title)}`, + `&body=${encodeURIComponent(githubIssueMessageBody(context))}`, + ] + .join("") + .trim(); + } + + // It's commonplace not to put the return type on most functions in Typescript. In this case, + // however, putting this return type creates a virtuous check of *all* the subrenderers to + // ensure that all of them return what we're expecting. + + render(): TemplateResult { + if (!this.event) { + return html``; + } + + switch (this.event?.action) { + case EventActions.ModelCreated: + case EventActions.ModelUpdated: + case EventActions.ModelDeleted: + return this.renderModelChanged(); + + case EventActions.AuthorizeApplication: + return this.renderAuthorizeApplication(); + + case EventActions.EmailSent: + return this.renderEmailSent(); + + case EventActions.SecretView: + return this.renderSecretView(); + + case EventActions.SystemException: + return this.renderSystemException(); + + case EventActions.PropertyMappingException: + return this.renderPropertyMappingException(); + + case EventActions.PolicyException: + return this.renderPolicyException(); + + case EventActions.PolicyExecution: + return this.renderPolicyExecution(); + + case EventActions.ConfigurationError: + return this.renderConfigurationError(); + + case EventActions.UpdateAvailable: + return this.renderUpdateAvailable(); + + // Action types which typically don't record any extra context. + // If context is not empty, we fall to the default response. + case EventActions.Login: + return this.renderLogin(); + + case EventActions.LoginFailed: + return this.renderLoginFailed(); + + case EventActions.Logout: + return this.renderLogout(); + + case EventActions.SystemTaskException: + return this.renderSystemTaskException(); + + default: + return this.renderDefaultResponse(); + } + } + + renderModelChanged() { + return html` +
    ${msg("Affected model:")}
    +
    + ${this.getModelInfo(this.event.context?.model as EventModel)} +
    + `; + } + + renderAuthorizeApplication() { + return html`
    +
    +
    ${msg("Authorized application:")}
    +
    + ${this.getModelInfo( + this.event.context.authorized_application as EventModel, + )} +
    +
    +
    +
    ${msg("Using flow")}
    +
    + ${until( + new FlowsApi(DEFAULT_CONFIG) + .flowsInstancesList({ + flowUuid: this.event.context.flow as string, + }) + .then((resp) => { + return html`${resp.results[0].name}`; + }), + html``, + )} + +
    +
    +
    + ${this.renderDefaultResponse()}`; + } + + renderEmailSent() { + return html`
    ${msg("Email info:")}
    +
    ${this.getEmailInfo(this.event.context)}
    + + + `; + } + + renderSecretView() { + return html`
    ${msg("Secret:")}
    + ${this.getModelInfo(this.event.context.secret as EventModel)}`; + } + + renderSystemException() { + return html`
    +
    +
    ${msg("Exception")}
    + +
    +
    ${this.event.context.message}
    +
    +
    +
    + ${this.renderDefaultResponse()}`; + } + + renderPropertyMappingException() { + return html`
    +
    +
    ${msg("Exception")}
    +
    +
    ${this.event.context.message || this.event.context.error}
    +
    +
    +
    +
    ${msg("Expression")}
    +
    + ${this.event.context.expression} +
    +
    +
    + ${this.renderDefaultResponse()}`; + } + + renderPolicyException() { + return html`
    +
    +
    ${msg("Binding")}
    + ${this.getModelInfo(this.event.context.binding as EventModel)} +
    +
    +
    ${msg("Request")}
    +
    +
      +
    • + ${msg("Object")}: + ${this.getModelInfo( + (this.event.context.request as EventContext).obj as EventModel, + )} +
    • +
    • + ${msg("Context")}: + ${JSON.stringify( + (this.event.context.request as EventContext).context, + null, + 4, + )} +
    • +
    +
    +
    +
    +
    ${msg("Exception")}
    +
    + ${this.event.context.message || this.event.context.error} +
    +
    +
    + ${this.renderDefaultResponse()}`; + } + + renderPolicyExecution() { + return html`
    +
    +
    ${msg("Binding")}
    + ${this.getModelInfo(this.event.context.binding as EventModel)} +
    +
    +
    ${msg("Request")}
    +
    +
      +
    • + ${msg("Object")}: + ${this.getModelInfo( + (this.event.context.request as EventContext).obj as EventModel, + )} +
    • +
    • + ${msg("Context")}: + ${JSON.stringify( + (this.event.context.request as EventContext).context, + null, + 4, + )} +
    • +
    +
    +
    +
    +
    ${msg("Result")}
    +
    +
      +
    • + ${msg("Passing")}: + ${(this.event.context.result as EventContext).passing} +
    • +
    • + ${msg("Messages")}: +
        + ${( + (this.event.context.result as EventContext) + .messages as string[] + ).map((msg) => { + return html`
      • ${msg}
      • `; + })} +
      +
    • +
    +
    +
    +
    + ${this.renderDefaultResponse()}`; + } + + renderConfigurationError() { + return html`
    ${this.event.context.message}
    + ${this.renderDefaultResponse()}`; + } + + renderUpdateAvailable() { + return html`
    ${msg("New version available")}
    + + ${this.event.context.new_version} + `; + // Action types which typically don't record any extra context. + // If context is not empty, we fall to the default response. + } + + renderLogin() { + if ("using_source" in this.event.context) { + return html`
    +
    +
    ${msg("Using source")}
    + ${this.getModelInfo(this.event.context.using_source as EventModel)} +
    +
    `; + } + return this.renderDefaultResponse(); + } + + renderLoginFailed() { + return html`
    + ${msg(str`Attempted to log in as ${this.event.context.username}`)} +
    + ${this.renderDefaultResponse()}`; + } + + renderLogout() { + if (Object.keys(this.event.context).length === 0) { + return html`${msg("No additional data available.")}`; + } + return this.renderDefaultResponse(); + } + + renderSystemTaskException() { + return html`
    +
    +
    ${msg("Exception")}
    +
    +
    ${this.event.context.message}
    +
    +
    +
    `; + } +} diff --git a/web/src/elements/events/ObjectChangelog.ts b/web/src/components/events/ObjectChangelog.ts similarity index 98% rename from web/src/elements/events/ObjectChangelog.ts rename to web/src/components/events/ObjectChangelog.ts index d9e53000f..160a98d73 100644 --- a/web/src/elements/events/ObjectChangelog.ts +++ b/web/src/components/events/ObjectChangelog.ts @@ -1,7 +1,7 @@ -import "@goauthentik/admin/events/EventInfo"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EventWithContext } from "@goauthentik/common/events"; import { uiConfig } from "@goauthentik/common/ui/config"; +import "@goauthentik/components/ak-event-info"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/Dropdown"; import "@goauthentik/elements/buttons/ModalButton"; diff --git a/web/src/elements/events/UserEvents.ts b/web/src/components/events/UserEvents.ts similarity index 87% rename from web/src/elements/events/UserEvents.ts rename to web/src/components/events/UserEvents.ts index e8107b0f4..8b8065792 100644 --- a/web/src/elements/events/UserEvents.ts +++ b/web/src/components/events/UserEvents.ts @@ -1,15 +1,13 @@ -import "@goauthentik/admin/events/EventInfo"; -import "@goauthentik/admin/events/EventInfo"; -import { ActionToLabel } from "@goauthentik/admin/events/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EventWithContext } from "@goauthentik/common/events"; +import { actionToLabel } from "@goauthentik/common/labels"; import { uiConfig } from "@goauthentik/common/ui/config"; +import "@goauthentik/components/ak-event-info"; import "@goauthentik/elements/Tabs"; import "@goauthentik/elements/buttons/Dropdown"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/SpinnerButton"; -import { PaginatedResponse } from "@goauthentik/elements/table/Table"; -import { Table, TableColumn } from "@goauthentik/elements/table/Table"; +import { PaginatedResponse, Table, TableColumn } from "@goauthentik/elements/table/Table"; import { msg, str } from "@lit/localize"; import { TemplateResult, html } from "lit"; @@ -47,7 +45,7 @@ export class UserEvents extends Table { row(item: EventWithContext): TemplateResult[] { return [ - html`${ActionToLabel(item.action)}`, + html`${actionToLabel(item.action)}`, html`
    ${item.user?.username}
    ${item.user.on_behalf_of ? html` diff --git a/web/src/elements/buttons/SpinnerButton/BaseTaskButton.ts b/web/src/elements/buttons/SpinnerButton/BaseTaskButton.ts index 9988a65fa..0b59a7937 100644 --- a/web/src/elements/buttons/SpinnerButton/BaseTaskButton.ts +++ b/web/src/elements/buttons/SpinnerButton/BaseTaskButton.ts @@ -118,6 +118,7 @@ export abstract class BaseTaskButton extends CustomEmitterElement(AKElement) { render() { return html`
    diff --git a/web/src/flow/stages/identification/IdentificationStage.ts b/web/src/flow/stages/identification/IdentificationStage.ts index 6e302f9a7..49b530026 100644 --- a/web/src/flow/stages/identification/IdentificationStage.ts +++ b/web/src/flow/stages/identification/IdentificationStage.ts @@ -1,4 +1,4 @@ -import { renderSourceIcon } from "@goauthentik/admin/sources/SourceViewPage"; +import { renderSourceIcon } from "@goauthentik/app/admin/sources/utils"; import "@goauthentik/elements/Divider"; import "@goauthentik/elements/EmptyState"; import "@goauthentik/elements/forms/FormElement"; diff --git a/web/src/user/LibraryApplication/index.ts b/web/src/user/LibraryApplication/index.ts index e4d9afc4f..54a611040 100644 --- a/web/src/user/LibraryApplication/index.ts +++ b/web/src/user/LibraryApplication/index.ts @@ -1,14 +1,16 @@ import { PFSize } from "@goauthentik/app/elements/Spinner"; import { truncateWords } from "@goauthentik/common/utils"; +import "@goauthentik/components/ak-app-icon"; import { AKElement, rootInterface } from "@goauthentik/elements/Base"; import "@goauthentik/elements/Expand"; -import "@goauthentik/user/LibraryApplication/AppIcon"; import { UserInterface } from "@goauthentik/user/UserInterface"; import { msg } from "@lit/localize"; -import { CSSResult, TemplateResult, css, html } from "lit"; +import { CSSResult, TemplateResult, css, html, nothing } from "lit"; import { customElement, property } from "lit/decorators.js"; +import { classMap } from "lit/directives/class-map.js"; import { ifDefined } from "lit/directives/if-defined.js"; +import { styleMap } from "lit/directives/style-map.js"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFCard from "@patternfly/patternfly/components/Card/card.css"; @@ -62,23 +64,44 @@ export class LibraryApplication extends AKElement { ]; } + renderExpansion(application: Application) { + const me = rootInterface()?.me; + + return html` +
    + ${application.metaPublisher} +
    + ${truncateWords(application.metaDescription || "", 10)} + ${rootInterface()?.uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser + ? html` + +  ${msg("Edit")} + + ` + : html``} +
    `; + } + render(): TemplateResult { if (!this.application) { return html``; } + const me = rootInterface()?.me; - let expandable = false; - if (rootInterface()?.uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser) { - expandable = true; - } - if (this.application.metaPublisher !== "" || this.application.metaDescription !== "") { - expandable = true; - } + const expandable = + (rootInterface()?.uiConfig?.enabledFeatures.applicationEdit && me?.user.isSuperuser) || + this.application.metaPublisher !== "" || + this.application.metaDescription !== ""; + + const classes = { "pf-m-selectable pf-m-selected": this.selected }; + const styles = this.background ? { background: this.background } : {}; + return html` `; } } diff --git a/web/src/user/user-settings/mfa/MFADeviceForm.ts b/web/src/user/user-settings/mfa/MFADeviceForm.ts index a2ea4ce09..0901d0bc9 100644 --- a/web/src/user/user-settings/mfa/MFADeviceForm.ts +++ b/web/src/user/user-settings/mfa/MFADeviceForm.ts @@ -39,13 +39,13 @@ export class MFADeviceForm extends ModelForm { sMSDeviceRequest: device, }); break; - case "otp_totp.TOTPDevice": + case "authentik_stages_authenticator_totp.TOTPDevice": await new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsTotpUpdate({ id: this.instance?.pk, tOTPDeviceRequest: device, }); break; - case "otp_static.StaticDevice": + case "authentik_stages_authenticator_static.StaticDevice": await new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsStaticUpdate({ id: this.instance?.pk, staticDeviceRequest: device, diff --git a/web/src/user/user-settings/mfa/MFADevicesPage.ts b/web/src/user/user-settings/mfa/MFADevicesPage.ts index 510fae335..5b26d152e 100644 --- a/web/src/user/user-settings/mfa/MFADevicesPage.ts +++ b/web/src/user/user-settings/mfa/MFADevicesPage.ts @@ -1,4 +1,5 @@ import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { deviceTypeName } from "@goauthentik/common/labels"; import "@goauthentik/elements/buttons/Dropdown"; import "@goauthentik/elements/buttons/ModalButton"; import "@goauthentik/elements/buttons/TokenCopyButton"; @@ -15,23 +16,8 @@ import { ifDefined } from "lit/directives/if-defined.js"; import { AuthenticatorsApi, Device, UserSetting } from "@goauthentik/api"; -export function stageToAuthenticatorName(stage: UserSetting): string { - if (stage.title) { - return stage.title; - } - return `Invalid stage component ${stage.component}`; -} - -export function deviceTypeName(device: Device): string { - switch (device.type) { - case "otp_static.StaticDevice": - return msg("Static tokens"); - case "otp_totp.TOTPDevice": - return msg("TOTP Device"); - default: - return device.verboseName; - } -} +export const stageToAuthenticatorName = (stage: UserSetting) => + stage.title ?? `Invalid stage component ${stage.component}`; @customElement("ak-user-settings-mfa") export class MFADevicesPage extends Table { @@ -57,7 +43,12 @@ export class MFADevicesPage extends Table { } columns(): TableColumn[] { - return [new TableColumn(msg("Name")), new TableColumn(msg("Type")), new TableColumn("")]; + // prettier-ignore + return [ + msg("Name"), + msg("Type"), + "" + ].map((th) => new TableColumn(th, "")); } renderToolbar(): TemplateResult { @@ -93,27 +84,19 @@ export class MFADevicesPage extends Table { } async deleteWrapper(device: Device) { + const api = new AuthenticatorsApi(DEFAULT_CONFIG); + const id = { id: device.pk }; switch (device.type) { case "authentik_stages_authenticator_duo.DuoDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsDuoDestroy({ - id: device.pk, - }); + return api.authenticatorsDuoDestroy(id); case "authentik_stages_authenticator_sms.SMSDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsSmsDestroy({ - id: device.pk, - }); - case "otp_totp.TOTPDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsTotpDestroy({ - id: device.pk, - }); - case "otp_static.StaticDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsStaticDestroy({ - id: device.pk, - }); + return api.authenticatorsSmsDestroy(id); + case "authentik_stages_authenticator_totp.TOTPDevice": + return api.authenticatorsTotpDestroy(id); + case "authentik_stages_authenticator_static.StaticDevice": + return api.authenticatorsStaticDestroy(id); case "authentik_stages_authenticator_webauthn.WebAuthnDevice": - return new AuthenticatorsApi(DEFAULT_CONFIG).authenticatorsWebauthnDestroy({ - id: device.pk, - }); + return api.authenticatorsWebauthnDestroy(id); default: break; } diff --git a/web/src/user/user-settings/sources/SourceSettings.ts b/web/src/user/user-settings/sources/SourceSettings.ts index 718c7d1c8..203eef9f3 100644 --- a/web/src/user/user-settings/sources/SourceSettings.ts +++ b/web/src/user/user-settings/sources/SourceSettings.ts @@ -1,4 +1,4 @@ -import { renderSourceIcon } from "@goauthentik/admin/sources/SourceViewPage"; +import { renderSourceIcon } from "@goauthentik/app/admin/sources/utils"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { me } from "@goauthentik/common/users"; diff --git a/web/src/user/user-settings/tokens/UserTokenList.ts b/web/src/user/user-settings/tokens/UserTokenList.ts index 63b6a5664..f32b06173 100644 --- a/web/src/user/user-settings/tokens/UserTokenList.ts +++ b/web/src/user/user-settings/tokens/UserTokenList.ts @@ -1,5 +1,5 @@ -import { IntentToLabel } from "@goauthentik/admin/tokens/TokenListPage"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; +import { intentToLabel } from "@goauthentik/common/labels"; import { uiConfig } from "@goauthentik/common/ui/config"; import { me } from "@goauthentik/common/users"; import { PFColor } from "@goauthentik/elements/Label"; @@ -119,7 +119,7 @@ export class UserTokenList extends Table {
    - ${IntentToLabel(item.intent || IntentEnum.Api)} + ${intentToLabel(item.intent ?? IntentEnum.Api)}
    diff --git a/web/xliff/de.xlf b/web/xliff/de.xlf index 4d40fa614..593f5c9b2 100644 --- a/web/xliff/de.xlf +++ b/web/xliff/de.xlf @@ -154,10 +154,6 @@ Messages Nachrichten - - New version available! - Neue Version verfügbar! - Using source Quelle verwenden @@ -2292,9 +2288,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. Aktuell sind keine Richtlinien mit diesem Objekt verknüpft. - - Create & bind Policy - Bind existing policy @@ -2697,10 +2690,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. Neue Quelle erstellen. - - Federation & Social login - Föderierter & Social Login - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Identitätsquellen, die entweder mit der Datenbank von authentik synchronisiert oder von Benutzern verwendet werden können, um sich selbst zu authentifizieren und zu registrieren. @@ -4048,18 +4037,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement Resident-Key-Anforderung - - The authenticator should not create a dedicated credential - Der Authentifikator sollte keine dedizierten Anmeldeinformationen erstellen - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - Der Authentifikator kann einen dedizierten Berechtigungsnachweis erstellen und speichern, aber wenn dies nicht der Fall ist, ist das auch in Ordnung - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Der Authentifikator MUSS einen dedizierten Berechtigungsnachweis erstellen. Wenn dies nicht möglich ist, ist der RP darauf vorbereitet, dass ein Fehler auftritt - Authenticator Attachment Authenticator-Anhang @@ -4644,9 +4621,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Phasen-Verknüpfung - - Create & bind Stage - Bind existing stage @@ -5214,18 +5188,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Anpassung - - Flows & Stages - Abläufe & Phasen - Directory Verzeichnis - - Tokens & App passwords - Tokens & App Passwörter - System System @@ -5893,6 +5859,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/en.xlf b/web/xliff/en.xlf index da9ff1d36..fbfbbb585 100644 --- a/web/xliff/en.xlf +++ b/web/xliff/en.xlf @@ -154,10 +154,6 @@ Messages Messages - - New version available! - New version available! - Using source Using source @@ -2438,10 +2434,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. No policies are currently bound to this object. - - Create & bind Policy - Create & bind Policy - Bind existing policy Bind existing policy @@ -2858,10 +2850,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. Create a new source. - - Federation & Social login - Federation & Social login - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. @@ -4273,18 +4261,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement Resident key requirement - - The authenticator should not create a dedicated credential - The authenticator should not create a dedicated credential - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Authenticator Attachment Authenticator Attachment @@ -4912,10 +4888,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Bind stage - - Create & bind Stage - Create & bind Stage - Bind existing stage Bind existing stage @@ -5512,18 +5484,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Customisation - - Flows & Stages - Flows & Stages - Directory Directory - - Tokens & App passwords - Tokens & App passwords - System System @@ -6209,6 +6173,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/es.xlf b/web/xliff/es.xlf index 93f5569e8..ab6bb5d56 100644 --- a/web/xliff/es.xlf +++ b/web/xliff/es.xlf @@ -148,10 +148,6 @@ Messages Mensajes - - New version available! - ¡Nueva versión disponible! - Using source Uso de la fuente @@ -2250,9 +2246,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. Actualmente, no hay políticas vinculadas a este objeto. - - Create & bind Policy - Bind existing policy @@ -2649,10 +2642,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. - - Federation & Social login - Inicio de sesión de federación y redes - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Fuentes de identidades, que se pueden sincronizar en la base de datos de authentik o que los usuarios pueden utilizar para autenticarse e inscribirse ellos mismos. @@ -3975,18 +3964,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement Requisito clave residente - - The authenticator should not create a dedicated credential - El autenticador no debe crear una credencial dedicada - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - El autenticador puede crear y almacenar una credencial dedicada, pero si no es así, también está bien - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - El autenticador DEBE crear una credencial dedicada. Si no puede, el RP está preparado para que se produzca un error - Authenticator Attachment Adjunto de autenticador @@ -4565,9 +4542,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Etapa Bind - - Create & bind Stage - Bind existing stage @@ -5131,18 +5105,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Personalización - - Flows & Stages - Flujos y etapas - Directory Directorio - - Tokens & App passwords - Tokens y contraseñas de aplicaciones - System Sistema @@ -5801,6 +5767,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/fr_FR.xlf b/web/xliff/fr_FR.xlf index bc2759dad..9bb71da72 100644 --- a/web/xliff/fr_FR.xlf +++ b/web/xliff/fr_FR.xlf @@ -153,10 +153,6 @@ Messages Messages - - New version available! - Une nouvelle version est disponible ! - Using source Utilisation de la source @@ -2308,10 +2304,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. Aucune politique n'est actuellement lié à cet objet. - - Create & bind Policy - Créer & Lier une politique - Bind existing policy Lier une politique existante @@ -2716,10 +2708,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. Créer une nouvelle source. - - Federation & Social login - Fédération & Connection Sociale - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Sources d'identités, qui peuvent soit être synchronisées dans la base de données d'authentik, soit être utilisées par les utilisateurs pour s'authentifier et s'inscrire. @@ -4054,15 +4042,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement - - The authenticator should not create a dedicated credential - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Authenticator Attachment @@ -4655,10 +4634,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Lier une étape - - Create & bind Stage - Créer & Lier une étape - Bind existing stage Lier une étape existante @@ -5228,18 +5203,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Personalisation - - Flows & Stages - Flux & Étapes - Directory Répertoire - - Tokens & App passwords - Jetons & mots de passe d'application - System Système @@ -5908,6 +5875,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/nl.xlf b/web/xliff/nl.xlf index 5ad2c8fe4..c6ac85543 100644 --- a/web/xliff/nl.xlf +++ b/web/xliff/nl.xlf @@ -3018,11 +3018,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d No policies are currently bound to this object. Er zijn momenteel geen beleidsregels aan dit object gekoppeld. - - - Create & bind Policy - Beleid aanmaken & koppelen - Bind existing policy @@ -3543,11 +3538,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d Create a new source. Een nieuwe bron aanmaken. - - - Federation & Social login - Federatie en sociale aanmelding - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. @@ -5419,11 +5409,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d Offset after which consent expires. Vertraging na verloop waarvan toestemming vervalt. - - - Statically deny the flow. To use this stage effectively, disable *Evaluate on plan* on the respective binding. - Weiger de flow statisch. Om deze fase effectief te gebruiken, schakelt u *Evaluatie op schema* uit voor de respectievelijke binding. - Dummy stage used for testing. Shows a simple continue button and always passes. @@ -6104,11 +6089,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d Bind stage Fase binden - - - Create & bind Stage - Fase aanmaken en binden - Bind existing stage @@ -6845,21 +6825,11 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de Customisation Aanpassing - - - Flows & Stages - Stromen & Stadia - Directory Map - - - Tokens & App passwords - Tokens & App-wachtwoorden - System @@ -7720,6 +7690,26 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de External: Extern: + + + Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + Statisch de flow weigeren. Om deze fase effectief te gebruiken, schakelt u Evalueren wanneer de flow is gepland uit bij de betreffende binding. + + + Create and bind Policy + Beleid aanmaken & koppelen + + + Federation and Social login + Federatie en sociale aanmelding + + + Create and bind Stage + Fase aanmaken en binden + + + Flows and Stages + Procedures & Fases diff --git a/web/xliff/pl.xlf b/web/xliff/pl.xlf index 8d3f9be51..e3a653154 100644 --- a/web/xliff/pl.xlf +++ b/web/xliff/pl.xlf @@ -154,10 +154,6 @@ Messages Wiadomości - - New version available! - Nowa wersja dostępna! - Using source Używając źródła @@ -2353,9 +2349,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. Żadne zasady nie są obecnie powiązane z tym obiektem. - - Create & bind Policy - Bind existing policy @@ -2764,10 +2757,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. Utwórz nowe źródło. - - Federation & Social login - Logowanie federacyjne i społecznościowe - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Źródła tożsamości, które mogą być zsynchronizowane z bazą danych authentik lub mogą być używane przez użytkowników do uwierzytelniania i rejestracji. @@ -4145,18 +4134,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement Wymagania dotyczące klucza rezydenta - - The authenticator should not create a dedicated credential - Program uwierzytelniający nie powinien tworzyć dedykowanego poświadczenia - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - Program uwierzytelniający może utworzyć i przechowywać dedykowane dane uwierzytelniające, ale jeśli nie, to też jest w porządku - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Autoryzator MUSI utworzyć dedykowane poświadczenie. Jeśli nie, RP jest przygotowany na wystąpienie błędu - Authenticator Attachment Załącznik uwierzytelniający @@ -4764,9 +4741,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Powiąż etap - - Create & bind Stage - Bind existing stage @@ -5352,18 +5326,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Dostosowywanie - - Flows & Stages - Przepływy i etapy - Directory Katalog - - Tokens & App passwords - Tokeny i hasła aplikacji - System System @@ -6040,6 +6006,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/pseudo-LOCALE.xlf b/web/xliff/pseudo-LOCALE.xlf index ceb9b0577..e2232c6a8 100644 --- a/web/xliff/pseudo-LOCALE.xlf +++ b/web/xliff/pseudo-LOCALE.xlf @@ -153,10 +153,6 @@ Messages - - - New version available! - Using source @@ -2412,10 +2408,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. - - - Create & bind Policy - Bind existing policy @@ -2832,10 +2824,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. - - - Federation & Social login - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. @@ -4236,18 +4224,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement - - - The authenticator should not create a dedicated credential - - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Authenticator Attachment @@ -4871,10 +4847,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage - - - Create & bind Stage - Bind existing stage @@ -5463,18 +5435,10 @@ Bindings to groups/users are checked against the user of the event. Customisation - - - Flows & Stages - Directory - - - Tokens & App passwords - System @@ -6144,6 +6108,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/tr.xlf b/web/xliff/tr.xlf index d6268cdc4..2b842266e 100644 --- a/web/xliff/tr.xlf +++ b/web/xliff/tr.xlf @@ -148,10 +148,6 @@ Messages İletiler - - New version available! - Yeni sürüm mevcut! - Using source Kaynak kullanma @@ -2249,9 +2245,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. Hiçbir ilke şu anda bu nesneye bağlı değildir. - - Create & bind Policy - Bind existing policy @@ -2648,10 +2641,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. - - Federation & Social login - Federasyon ve Sosyal Giriş - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. Auentik'in veritabanına senkronize edilebilen ya da kullanıcılar tarafından kimlik doğrulaması ve kayıt yaptırmak için kullanılabilen kimliklerin kaynakları. @@ -3973,15 +3962,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement - - The authenticator should not create a dedicated credential - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - Authenticator Attachment @@ -4556,9 +4536,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Bağlama aşaması - - Create & bind Stage - Bind existing stage @@ -5121,18 +5098,10 @@ Bindings to groups/users are checked against the user of the event. Customisation Özelleştirme - - Flows & Stages - Akışlar ve Aşamalar - Directory Rehber - - Tokens & App passwords - Belirteçler ve Uygulama parolaları - System Sistem @@ -5791,6 +5760,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/zh-Hans.xlf b/web/xliff/zh-Hans.xlf index bc84afab9..e3767a0cf 100644 --- a/web/xliff/zh-Hans.xlf +++ b/web/xliff/zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -190,11 +190,6 @@ Messages 消息 - - - New version available! - 新版本可用! - Using source @@ -618,9 +613,9 @@ - The URL "" was not found. - 未找到 URL " - "。 + The URL "" was not found. + 未找到 URL " + "。 @@ -1072,8 +1067,8 @@ - To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. - 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 @@ -1819,8 +1814,8 @@ - Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". + 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 @@ -3041,11 +3036,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. 当前没有策略绑定到此对象。 - - - Create & bind Policy - 创建 & 绑定策略 - Bind existing policy @@ -3248,8 +3238,8 @@ doesn't pass when either or both of the selected options are equal or above the - Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' + 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' @@ -3566,11 +3556,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. 创建一个新身份来源。 - - - Federation & Social login - 联结与社交登录 - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. @@ -4046,8 +4031,8 @@ doesn't pass when either or both of the selected options are equal or above the - When using an external logging solution for archiving, this can be set to "minutes=5". - 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 + When using an external logging solution for archiving, this can be set to "minutes=5". + 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 @@ -4056,8 +4041,8 @@ doesn't pass when either or both of the selected options are equal or above the - Format: "weeks=3;days=2;hours=3,seconds=2". - 格式:"weeks=3;days=2;hours=3,seconds=2"。 + Format: "weeks=3;days=2;hours=3,seconds=2". + 格式:"weeks=3;days=2;hours=3,seconds=2"。 @@ -4253,10 +4238,10 @@ doesn't pass when either or both of the selected options are equal or above the - Are you sure you want to update ""? + Are you sure you want to update ""? 您确定要更新 - " - " 吗? + " + " 吗? @@ -5340,21 +5325,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement 常驻钥匙要求 - - - The authenticator should not create a dedicated credential - 身份验证器不应该创建专用凭据 - - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - 身份验证器可以创建和存储专用凭据,但不创建也可以 - - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - 身份验证器必须创建专用凭据。如果不能,RP 预期会发生错误 - Authenticator Attachment @@ -5372,7 +5342,7 @@ doesn't pass when either or both of the selected options are equal or above the - A "roaming" authenticator, like a YubiKey + A "roaming" authenticator, like a YubiKey 像 YubiKey 这样的“漫游”身份验证器 @@ -5707,10 +5677,10 @@ doesn't pass when either or both of the selected options are equal or above the - ("", of type ) + ("", of type ) - (" - ",类型为 + (" + ",类型为 @@ -5759,7 +5729,7 @@ doesn't pass when either or both of the selected options are equal or above the - If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. 如果设置时长大于 0,用户可以选择“保持登录”选项,这将使用户的会话延长此处设置的时间。 @@ -6140,11 +6110,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage 绑定阶段 - - - Create & bind Stage - 创建 & 绑定阶段 - Bind existing stage @@ -6889,21 +6854,11 @@ Bindings to groups/users are checked against the user of the event. Customisation 自定义 - - - Flows & Stages - 流程与阶段 - Directory 目录 - - - Tokens & App passwords - 令牌和应用程序密码 - System @@ -7774,7 +7729,68 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + 静态拒绝流。要有效地使用此阶段,请在相应的绑定上禁用*规划时进行评估*。 + + + Create and bind Policy + 创建与绑定策略 + + + Federation and Social login + 联结与社交登录 + + + Create and bind Stage + 创建与绑定阶段 + + + Flows and Stages + 流程与阶段 + + + New version available + 新版本可用 + + + Failure result + 失败结果 + + + Pass + 通过 + + + Don't pass + 不通过 + + + Result used when policy execution fails. + 策略执行失败时的结果。 + + + Required: User verification must occur. + 必需:必须进行用户验证。 + + + Preferred: User verification is preferred if available, but not required. + 首选:尽可能进行用户验证,但不是必须。 + + + Discouraged: User verification should not occur. + 避免:不应该进行用户验证。 + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + 必需:身份验证器必须创建专用凭据。如果不能,RP 预期会发生错误 + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + 首选:身份验证器可以创建和存储专用凭据,但不创建也可以 + + + Discouraged: The authenticator should not create a dedicated credential + 避免:身份验证器不应该创建专用凭据 - + \ No newline at end of file diff --git a/web/xliff/zh-Hant.xlf b/web/xliff/zh-Hant.xlf index 4afbc635a..4861d6f56 100644 --- a/web/xliff/zh-Hant.xlf +++ b/web/xliff/zh-Hant.xlf @@ -154,10 +154,6 @@ Messages 信息 - - New version available! - 新版本可用! - Using source 使用源 @@ -2273,9 +2269,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. 当前没有策略绑定到此对象。 - - Create & bind Policy - Bind existing policy @@ -2674,10 +2667,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. 创建一个新身份来源。 - - Federation & Social login - 联盟和社交登录 - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. 身份来源,既可以同步到authentik的数据库中,也可以被用户用来进行身份验证和注册。 @@ -4011,18 +4000,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement 常驻钥匙要求 - - The authenticator should not create a dedicated credential - 身份验证者不应创建专用凭据 - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - 身份验证器可以创建和存储专用凭据,但如果没有,那也没关系 - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - 身份验证者必须创建专用凭据。如果不能,RP 已做好准备以防发生错误 - Authenticator Attachment 身份验证器附件 @@ -4603,9 +4580,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Bind 阶段 - - Create & bind Stage - Bind existing stage @@ -5172,18 +5146,10 @@ Bindings to groups/users are checked against the user of the event. Customisation 定制 - - Flows & Stages - 流程和阶段 - Directory 目录 - - Tokens & App passwords - 令牌和应用程序密码 - System 系统 @@ -5846,6 +5812,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/web/xliff/zh_CN.xlf b/web/xliff/zh_CN.xlf index 3c65feaf1..113c3491f 100644 --- a/web/xliff/zh_CN.xlf +++ b/web/xliff/zh_CN.xlf @@ -190,11 +190,6 @@ Messages 消息 - - - New version available! - 新版本可用! - Using source @@ -3041,11 +3036,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. 当前没有策略绑定到此对象。 - - - Create & bind Policy - 创建 & 绑定策略 - Bind existing policy @@ -3566,11 +3556,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. 创建一个新身份来源。 - - - Federation & Social login - 联结与社交登录 - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. @@ -5340,21 +5325,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement 常驻钥匙要求 - - - The authenticator should not create a dedicated credential - 身份验证器不应该创建专用凭据 - - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - 身份验证器可以创建和存储专用凭据,但不创建也可以 - - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - 身份验证器必须创建专用凭据。如果不能,RP 预期会发生错误 - Authenticator Attachment @@ -5455,11 +5425,6 @@ doesn't pass when either or both of the selected options are equal or above the Offset after which consent expires. 同意过期后的偏移。 - - - Statically deny the flow. To use this stage effectively, disable *Evaluate on plan* on the respective binding. - 静态拒绝流。要有效地使用此阶段,请在相应的绑定上禁用*规划时进行评估*。 - Dummy stage used for testing. Shows a simple continue button and always passes. @@ -6145,11 +6110,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage 绑定阶段 - - - Create & bind Stage - 创建 & 绑定阶段 - Bind existing stage @@ -6894,21 +6854,11 @@ Bindings to groups/users are checked against the user of the event. Customisation 自定义 - - - Flows & Stages - 流程与阶段 - Directory 目录 - - - Tokens & App passwords - 令牌和应用程序密码 - System @@ -7776,6 +7726,70 @@ Bindings to groups/users are checked against the user of the event. External: 外部: + + + Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + 静态拒绝流。要有效地使用此阶段,请在相应的绑定上禁用*规划时进行评估*。 + + + Create and bind Policy + 创建与绑定策略 + + + Federation and Social login + 联结与社交登录 + + + Create and bind Stage + 创建与绑定阶段 + + + Flows and Stages + 流程与阶段 + + + New version available + 新版本可用 + + + Failure result + 失败结果 + + + Pass + 通过 + + + Don't pass + 不通过 + + + Result used when policy execution fails. + 策略执行失败时的结果。 + + + Required: User verification must occur. + 必需:必须进行用户验证。 + + + Preferred: User verification is preferred if available, but not required. + 首选:尽可能进行用户验证,但不是必须。 + + + Discouraged: User verification should not occur. + 避免:不应该进行用户验证。 + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + 必需:身份验证器必须创建专用凭据。如果不能,RP 预期会发生错误 + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + 首选:身份验证器可以创建和存储专用凭据,但不创建也可以 + + + Discouraged: The authenticator should not create a dedicated credential + 避免:身份验证器不应该创建专用凭据 diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index 83a3798ad..e3640fe0c 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -154,10 +154,6 @@ Messages 信息 - - New version available! - 新版本可用! - Using source 使用源 @@ -2273,9 +2269,6 @@ doesn't pass when either or both of the selected options are equal or above the No policies are currently bound to this object. 当前没有策略绑定到此对象。 - - Create & bind Policy - Bind existing policy @@ -2674,10 +2667,6 @@ doesn't pass when either or both of the selected options are equal or above the Create a new source. 创建一个新身份来源。 - - Federation & Social login - 联盟和社交登录 - Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. 身份来源,既可以同步到authentik的数据库中,也可以被用户用来进行身份验证和注册。 @@ -4011,18 +4000,6 @@ doesn't pass when either or both of the selected options are equal or above the Resident key requirement 常驻钥匙要求 - - The authenticator should not create a dedicated credential - 身份验证者不应创建专用凭据 - - - The authenticator can create and store a dedicated credential, but if it doesn't that's alright too - 身份验证器可以创建和存储专用凭据,但如果没有,那也没关系 - - - The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur - 身份验证者必须创建专用凭据。如果不能,RP 已做好准备以防发生错误 - Authenticator Attachment 身份验证器附件 @@ -4602,9 +4579,6 @@ doesn't pass when either or both of the selected options are equal or above the Bind stage Bind 阶段 - - Create & bind Stage - Bind existing stage @@ -5171,18 +5145,10 @@ Bindings to groups/users are checked against the user of the event. Customisation 定制 - - Flows & Stages - 流程和阶段 - Directory 目录 - - Tokens & App passwords - 令牌和应用程序密码 - System 系统 @@ -5845,6 +5811,51 @@ Bindings to groups/users are checked against the user of the event. Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + + + Create and bind Policy + + + Federation and Social login + + + Create and bind Stage + + + Flows and Stages + + + New version available + + + Failure result + + + Pass + + + Don't pass + + + Result used when policy execution fails. + + + Required: User verification must occur. + + + Preferred: User verification is preferred if available, but not required. + + + Discouraged: User verification should not occur. + + + Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + + + Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + + + Discouraged: The authenticator should not create a dedicated credential diff --git a/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/image1.png b/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/image1.png new file mode 100644 index 000000000..61cd55bf5 Binary files /dev/null and b/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/image1.png differ diff --git a/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/item.md b/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/item.md new file mode 100644 index 000000000..05c4d6a04 --- /dev/null +++ b/website/blog/2023-08-31-announcing-the-authentik-enterprise-release/item.md @@ -0,0 +1,56 @@ +--- +title: Announcing the authentik Enterprise release! +slug: 2023-08-31-announcing-the-authentik-enterprise-release +authors: + - name: Jens Langhammer + title: CTO at Authentik Security Inc + url: https://github.com/BeryJu + image_url: https://github.com/BeryJu.png +tags: + - founder + - SSO + - open source + - community + - identity provider + - enterprise + - support + - help-center + - security + - authentication +hide_table_of_contents: false +image: ./image1.png +--- + +📣 We are happy to announce that the first authentik Enterprise release is here! 🎉 + +The Enterprise release of authentik provides all of the functionality that we have spent years building in our open source product, plus dedicated support and account management. +This Enterprise version is available in Preview mode in our latest release, 2023.8. + +This is an exciting step for us, as we grow the team and the company and our user base. We officially became a company just last fall (I wrote about it in November 2022, in “[The next step for authentik"](../2022-11-02-the-next-step-for-authentik/item.md)), and this release is another move forwards in maturing authentik into the SSO and identity management app of choice. + +One thing we want to acknowledge, up front, is that we would never have been able to achieve this goal without the years of support from our open source community. You all helped build authentik into what it is today, and that’s why all of our Enterprise-level features will be open core and source available, always. + +![](./image1.png) + + + +To upgrade and get going with the Enterprise version, refer to our documentation for instructions for your deployment: + +- [Docker Compose installation](../docs/installation/docker-compose) +- [Kubernetes installation](../docs/installation/kubernetes) + +Keeping it simple, we made sure that installing and upgrading authentik is exactly the same process for both Enterprise version and our free open source version. + +With this first Enterprise release, dedicated support is the feature; this version provides access to our Support center where you can open tickets, view tickets and their progress, and ask questions about your Enterprise product. + +For our open source community, we will continue to engage in the robust conversations and problem-solving, as always, in our Discord server. These conversation and community collaboration are the heart and soul of authentik… we learn from everyone, and we will always be active and responsive there within our community. + +Check out our Enterprise documentation for information about creating and managing your organization, purchasing and activating a license, accessing support, and managing billing and organization members. + +- [Get started with Enterprise](../docs/enterprise/get-started) +- [Manage you Enterprise account](../docs/enterprise/manage-enterprise) +- [Support for Enterprise accounts](../docs/enterprise/entsupport) + +In future releases, we will be adding additional Enterprise features, including RBAC support, inbuilt remote desktop access, and an authentik mobile app for multi-factor authentication. + +For this preview release of authentik Enterprise, we’d like to hear from you; thoughts and suggestions, questions, any specific direction that you’d like to see the Enterprise version focus on? Contact us at [hello@goauthentik.io](mailto:hello@goauthentik.io). diff --git a/website/blog/2023-09-11-sourcegraph-security-incident/image1.jpg b/website/blog/2023-09-11-sourcegraph-security-incident/image1.jpg new file mode 100644 index 000000000..48afa4f5f Binary files /dev/null and b/website/blog/2023-09-11-sourcegraph-security-incident/image1.jpg differ diff --git a/website/blog/2023-09-11-sourcegraph-security-incident/item.md b/website/blog/2023-09-11-sourcegraph-security-incident/item.md new file mode 100644 index 000000000..273047e70 --- /dev/null +++ b/website/blog/2023-09-11-sourcegraph-security-incident/item.md @@ -0,0 +1,83 @@ +--- +title: "Sourcegraph security incident: the good, the bad, and the dangers of access tokens" +slug: 2023-08-11-sourcegraph-security-incident +authors: + - name: Jens Langhammer + title: CTO at Authentik Security Inc + url: https://github.com/BeryJu + image_url: https://github.com/BeryJu.png +tags: + - Sourcegraph + - token + - transparency + - identity provider + - leaks + - breach + - cybersecurity + - security + - authentication +hide_table_of_contents: false +image: ./image1.jpg +--- + +Access tokens make identity management and authentication relatively painless for our end-users. But, like anything to do with access, tokens also can be fraught with risk and abuse. + +The recent [announcement](https://about.sourcegraph.com/blog/security-update-august-2023) from Sourcegraph that their platform had been penetrated by a malicious hacker using a leaked access token is a classic example of this balance of tokens being great… until they are in the wrong hands. + +This incident prompts all of us in the software industry to take yet another look at how our security around user identity and access can be best handled, to see if there are lessons to be learned and improvements to be made. These closer looks are not only at how our own software and users utilizes (and protects) access tokens, but also in how such incidents are caught, mitigated, and communicated. + +![Photo by Anton Maksimov 5642.su on Unsplash](./image1.jpg) + + + +## What happened at Sourcegraph + +The behavior of the malicious hacker after they accessed the platform reveal a fairly typical pattern: access the system, gain additional rights by creating new user accounts, switching accounts to fully probe the system, and finally, inviting other malicious actors in through the breach. Unfortunately, it is usually that last step, not the first, that sets off alarm bells. + +Let’s take a look at what occurred at Sourcegraph. + +On July 14, 2023, an engineer at Sourcegraph created a PR and committed a code change to GitHub that contained an active site-admin access token. This level of access token had privileges to not only view but also edit user account information. + +For the next two weeks, the leak seems to have remained undetected, but on Aug 28 a new account was created, apparently by the hacker-to-be, and on Aug 30th the hacker used the leaked token to grant their account admin-level privileges, thereby gaining access to the Admin dashboard. + +On the dashboard, the hacker was able to see the first 20 accounts displayed, along with the license keys for each account. Sourcegraph did [state](https://www.securityweek.com/sourcegraph-discloses-data-breach-following-access-token-leak/) that possession of the license key did not allow for access to each account’s Sourcegraph instance, fortunately. + +However, the intruder didn’t stop with seeing the license keys; they went on to create a proxy app that allowed any users of the app to access Sourcegraph’s APIs for free. Instructions on how to use the app were widely circulated on the internet, with almost 2 million views. + +> “_Users were instructed to create free Sourcegraph.com accounts, generate access tokens, and then request the malicious user to greatly increase their rate limit._” ([source](https://about.sourcegraph.com/blog/security-update-august-2023)) + +The subsequent spike in API usage is what alerted the Sourcegraph security team to a problem, the very same day, August 30, 2023. The team identified the hacker’s site-admin account, closed the account and then began an investigation and mitigation process. + +One significant detail is how the malicious hacker obtained the access token in the first place: from a commit made to the Sourcegraph repository on GitHub. It’s unlikely we will ever know how the token was included in the commit. What we do know is that shortly after the breach was announced a [PR](https://github.com/sourcegraph/sourcegraph/pull/56363) was opened to remove from the Sourcegraph documentation instructions about hardcodong access tokens . + +Most companies have serious checks in their automated build processes, and it sounds like Sourcegraph did have some checks in place, but it didn’t catch the exposure of this access token in the commit. Back to the statement about these types of incidents causing us all to look again, more closely, at our practices; here at Authentik Security we do indeed have a very robust set of checks in place as part of our required CI/CD pipeline, and we use [Semgrep](https://github.com/returntocorp/semgrep) to search for tokens and other artifacts that we not want to expose. With Semgrep, you can write a custom rule to look for an exact token schema, so that no matter what type of tokens you use, their presence in the code base can be discovered. + +## Best practice around tokens + +Access tokens have for decades been an essential artifact used in application systems to efficiently and securely manage authentication. They are not going away anytime soon. The onus is on the software companies, and their security engineers, to optimize the protection of access tokens. + +The best known best practice around access tokens is to make sure that they have a very short shelf-life; they should expire and be unusable within minutes, not hours or days. This is standard practice. In authentik, by default we set the expiration for access tokens at 5 minutes, and we use JWT (JSON Web Tokens) for added security. We blogged about this recently, have a [read](https://goauthentik.io/blog/2023-03-30-JWT-a-token-that-changed-how-we-see-identity). + +Of course, there are also refresh tokens to be considered, and protected. There also needs to be strong security around refresh tokens, because they can be used to create new access tokens. Refresh tokens are typically never passed externally, and if the authorization server is a different one than the application server, then the application server will not even see refresh tokens (only short-lived access tokens). Note that this would not have helped in the Sourcegraph incident, since the malicious hacker had admin-level access, and thus had access to the secure cookie with the refresh token. + +## Security breaches are inevitable + +Constant effort is required to stay ahead of malicious hackers, and we can’t always, not every time. Beyond specific best practices for tokens, security teams can focus on building a company culture that includes an in-depth defense strategy that use encryption for tokens (and other sensitive values) in transit and at rest. Other basic, low-hanging fruit in a solid security plan include purposeful secrets management, granting the “least privilege” needed, and implementing SCA (_software composition analysis_) tooling. + +However if a security breach does occur, it’s very important (on many levels) how the hacked company responds to the incident. And the very first part of the response is the _acknowledgement_ that a breach occurred. This act alone, of announcing what happened, when, how, who was impacted, and what the mitigation plans are is absolutely crucial. + +Sourcegraph did a great job here; they let us know the same day they knew, and they shared as many details as possible. + +> Transparency about the discovery and all the gory details of the breach is vital; it rebuilds trust with users. + +Could the breach have been prevented? Sure, of course, on several fronts. The leaked access token should have been found and removed from the code _before_ the commit was made, thus never even available in GitHub repository. Or even if it got into the code base on the repo, a subsequent Semgrep analysis could have caught it, and the token revoked and removed. As it was, two weeks passed with the token sitting there, in public view, before a malicious hacker found and used it. + +However, another thing that Sourcegraph got right was their internal architecture and security practices; the fact that they did not store all of the data in one place prevented the intruder from going very deep. + +> Sourcegraph [stated](https://about.sourcegraph.com/blog/security-update-august-2023) “Customer private data and code resides in isolated environments and were therefore not impacted by this event.**”** + +Sourcegraph was clear and open about exactly who was impacted, and exactly how they were impacted. For open source users it was email addresses. For paid customers, the malicious user could only view the first 20 license key items on the admin dashboard page, and the license keys did not provide access to the users' instances. + +## Lessons learned, by all of us + +In hindsight, it’s easy to comment on how SourceGraph handled this breach, what they did right and where they could have done better. But the truth is, that with every security incident, ever leaked token, every malicious hack, we all learn new ways to strengthen our security. Hopefully we also continue to learn the importance of transparency, rapid acknowledgement, and full disclosure about the breaches that do, nonetheless, occur. diff --git a/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/image1.jpg b/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/image1.jpg new file mode 100644 index 000000000..24ad033cd Binary files /dev/null and b/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/image1.jpg differ diff --git a/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/item.md b/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/item.md new file mode 100644 index 000000000..aa62569f2 --- /dev/null +++ b/website/blog/2023-09-14-black-box-security-software-cant-keep-up-with-open-source/item.md @@ -0,0 +1,137 @@ +--- +title: Black box security software can’t keep up with open source +slug: 2023-09-14-black-box-security-software-cant-keep-up-with-open-source +authors: + - name: Jens Langhammer + title: CTO at Authentik Security Inc + url: https://github.com/BeryJu + image_url: https://github.com/BeryJu.png +tags: + - open core + - SSO + - open source + - community + - identity provider + - enterprise + - source available + - closed source + - security + - authentication +hide_table_of_contents: false +image: ./image1.jpg +--- + +> **_authentik is an open source Identity Provider that unifies your identity needs into a single platform, replacing Okta, Active Directory, and auth0. Authentik Security is a [public benefit company](https://github.com/OpenCoreVentures/ocv-public-benefit-company/blob/main/ocv-public-benefit-company-charter.md) building on top of the open source project._** + +--- + +Legacy security vendors that rely on black box development can't keep up with open source. It's an oft—discussed topic-the ability of open source communities to quickly jump in and collectively solve problems and innovate solutions—but it is equally believed that "serious" security software companies have proprietary software. + +In this blog, we will take a closer look at the pros and cons of the various source availability types of SSO and other security software. + +!["mike-kononov-lFv0V3_2H6s-unsplash.jpg"](./image1.jpg) + + + +Since we’re going to use these terms a lot in our discussion, some definitions first: + +| | | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| Open source | Code that is free to inspect, use, modify, and distribute | +| Closed source | Code that is proprietary and not publicly available | +| Open core | A business model based on a core codebase that’s open source (the "open core"), with licensed, proprietary features built on top | +| Source available | Code that is publicly visible, but must be licensed to use, modify, or distribute (e.g. the proprietary code of an open core company) | + +## Why do people choose closed vs open source? + +### Security through obscurity + +“Walled garden” security software relies on keeping the code secret, which _can_ make it harder for hackers to exploit. Some open source skeptics say that transparency makes the code more vulnerable: bad actors can inspect and modify open source code without having to dig into binary code or reverse engineer anything. + +However, with closed source solutions, you’re completely reliant on the vendor having robust security practices—both before and during the event of a critical vulnerability. The technology landscape shifts so quickly and your possible attack surface grows constantly, so it can be a tall order for teams working on proprietary software to keep up with innovation. Closed source software is still vulnerable to zero-day attacks or exploitation of systems that haven’t yet applied a security patch. + +### Getting ahead of vulnerabilities + +Bug bounty programs are one way for closed source security vendors to preempt exploitation, but the prizes need to be sufficiently compelling. Bad actors can still choose to disclose their findings to the highest bidder instead of the vendor. + +At least with open source projects, on balance there are likely to be more good actors actively working with and on the code, or ready to respond to Common Vulnerabilities and Exposures (CVEs). + +### Rapid response + +If you’re using a closed source solution, you have to wait for the vendor to tell you what to do in the event of a major vulnerability. In the meantime, you just stop using potentially affected parts of your system until they can communicate the impact and how to remediate. + +With open source, you have the benefit of a community working together towards the same goal. In a breach, you don’t have to wait around for a vendor to act: you can get patches from the upstream project or hotfix the issue yourself (in the case of smaller open source projects which might be slower to respond). + +> Average time-to-fix (TTF) vulnerabilities is now actually faster for open source projects than proprietary software (see Snyk’s [State of Open Source Security Report 2023](https://go.snyk.io/state-of-open-source-security-report-2023-dwn-typ.html)). + +## Compliance + +Sometimes the choice of closed source has little to do with whether or not the source code is public, and more to do with the requirements of governing bodies and auditors. It’s easier to sell a legacy proprietary solution to stakeholders (in the vein of “Nobody ever got fired for buying IBM”) because they check the right boxes and satisfy compliance requirements. For some organizations, requirements dictate that you need a contract with a vendor rather than relying on an unsupported, community-driven service. Open core solutions can help to fill this gap (which we’ll go into under Support and accountability below). + +### Open source projects can have certifications too + +Not all open source projects have the time and resources to invest in certifications, but some are pursuing these to make it easier for their solution to be approved for use. At Authentik Security, we’re currently working towards an [ISO/ISE 27001](https://www.iso.org/standard/27001) for authentik, the open source project. + +### Certifications don’t _guarantee_ better security + +Certifications don’t cover all possible paths to exploitation. Plenty of the major data breaches of the past decade ([Okta](https://www.forbes.com/sites/thomasbrewster/2022/03/23/okta-hack-exposes-a-huge-hole-in-tech-giant-security/), [Experian](https://krebsonsecurity.com/2023/01/experian-glitch-exposing-credit-files-lasted-47-days/), [T-Mobile](https://www.t-mobile.com/news/business/customer-information)) were targeted at the type of large enterprises that likely have every possible security certification, yet they were still hacked. Simply proving that a third party verified that you’re taking _some_ steps to safeguard some data isn’t enough. As the saying goes, the defender needs to win every time, but the attacker only needs to win once. + +With [supply chain attacks](https://goauthentik.io/blog/2023-04-07-supply-chain-attacks-what-we-can-all-do-better) becoming more common, you can better understand the provenance of open source code, because you have visibility into dependencies and can validate whether the project is using security tools like Static Composition Analysis (SCA), static or dynamic application security testing (SAST/DAST), multi-factor authentication, etc. + +## Support and accountability + +> “... big corporations want a neck to choke when things go wrong and Linus is hard to track down” — [steppinraz0r on reddit](https://www.reddit.com/r/cybersecurity/comments/15c3h0q/told_by_a_senior_programmer_that_open_source/jtz0yzx/) + +Having a security vendor means accountability: formal support for implementation, bugs, and vulnerabilities. When choosing open source, you do have to consider whether you have the in-house expertise for management and maintenance. Or how confident are you in community support? + +There are some legitimate concerns to raise with closed source support though. Some vendors outsource technical support to a third party, which may or may not be vetted (as in the [Okta breach of January 2022](https://www.forbes.com/sites/thomasbrewster/2022/03/23/okta-hack-exposes-a-huge-hole-in-tech-giant-security/)). And, as we saw above, [open source projects actually beat closed source vendors on TTF](https://go.snyk.io/state-of-open-source-security-report-2023-dwn-typ.html). + +Security, authentication, and identity management are mission-critical services. For most companies, it’s wiser to be able to run and manage these in house. Again, open core can provide a happy medium solution, as you get: + +- The visibility and transparency of open source +- Total flexibility and modifiability over the open source core +- A contract with a company who is actively contributing to and improving the product, and +- Support for setup and remediation (we just launched dedicated [support for Authentik Security Enterprise](https://goauthentik.io/blog/2023-08-31-announcing-the-authentik-enterprise-release)!) + +# Neither open nor closed source is _inherently_ more secure + +> “The idea that software is inherently safer because it’s released under an open source license is overly simplistic in the extreme. Just the most obvious reason for this is that opportunity for independent review doesn't guarantee that review will happen. The wisdom of the crowd doesn’t guarantee a third-party review will be better or more thorough than a solid first-party system. Open source provides the possibility of review, and that’s all. Hypothetical eyes make no bugs shallow.” — [godel_unicode on Hacker News](https://news.ycombinator.com/item?id=12284600) + +Open source is not a silver bullet for security. The code may be open for inspection, but that doesn’t mean that people are actively examining the code for vulnerabilities. + +> “There is evidence that the people who have access to open source are more active in creating new code and extensions than auditing existing code. [One recent study](https://www.darkreading.com/application-security/open-source-developers-still-not-interested-in-secure-coding) showed that OSS developers spent less than 3% of their time working on improving security.” — Eugene H. Spafford, Josiah Dykstra, Leigh Metcalf, [What is Cybersecurity?](https://www.informit.com/articles/article.aspx?p=3172442&seqNum=9) + +On the other hand, while closed source code may be hidden and has dedicated teams actively working to secure it, reverse engineering is still possible. + +With open source, you also have greater flexibility to avoid vendor lock-in if you’re not comfortable with a vendor’s choices. A recent [DEFCON talk](https://github.com/nyxgeek/track_the_planet/blob/main/nyxgeek_Track_the_Planet_2023.08.14.pdf) shared a user enumeration security risk in Microsoft Azure, which Microsoft did not deem a vulnerability. If you use Azure and don’t want to take that risk, your only option is to switch providers, which can be an onerous change. + +With open source, you can fork the project. This can also be true for tools with an open core model: depending on the license for the proprietary edition you may still be able to modify the code. + +# Can you trust (but verify)? + +There will always be bugs and vulnerabilities in software, whatever the distribution model. Accepting that, which model gives you more confidence? + +Whatever solution you choose (whether it’s for authentication, authorization, or scanning), you need to trust that your security vendor will be honest and practice _responsible disclosure_. + +The Okta breach eroded trust and reminded us of some critical considerations: + +### Do you trust your vendor’s supply chain? + +If you’re entrusting a vendor with a mission-critical, sensitive service like authentication, you are also putting your trust in every vendor they choose to work with (which you may not have visibility into). + +### Can you expect your vendor to be transparent? + +Closed source vendors will optimize for different things when facing a security risk or vulnerability. They must mitigate for their customers as well as considering factors like protecting their reputation. They have to balance damage control with transparency (do they disclose immediately, even before they’re sure of the extent of customers affected?). + +Open source projects can also suffer reputation damage. However it’s harder to hide vulnerabilities in public code, and the culture of transparency in open source communities is also an incentive that helps to hold open source vendors accountable. + +These factors make it hard to take closed source vendors at their word. With open source code (and some source available solutions, depending on the license), you have the reassurance of being able to: + +- Validate what the code does and how it does it +- Know what developments are being made +- Modify the code yourself +- For greatest confidence and control, [self host](https://goauthentik.io/blog/2023-01-24-saas-should-not-be-the-default) + +For mission-critical services like authentication and identity management, you don’t want to be beholden to a third party to be transparent and act quickly in the event of a CVE. Using security tools that build on open source gives you the most visibility and the flexibility. + +Authentik Security offers both an open source version and a source available version of our flagship product, [authentik](https://goauthentik.io/). Either way, we don't ever give you a black box. diff --git a/website/developer-docs/docs/templates/conceptual.md b/website/developer-docs/docs/templates/conceptual.md index 2038d6669..fc12c3998 100644 --- a/website/developer-docs/docs/templates/conceptual.md +++ b/website/developer-docs/docs/templates/conceptual.md @@ -2,6 +2,16 @@ title: "Conceptual topic" --- +:::info +**How to use this template**: start with the markdown version of the template, either by copying the [`conceptual.tmpl.md`](https://github.com/goauthentik/authentik/tree/main/website/developer-docs/docs/templates) file from our GitHub repo or downloading the template file using the following command: + +``` +wget https://raw.githubusercontent.com/goauthentik/authentik/main/website/developer-docs/docs/templates/conceptual.tmpl.md +``` + +Edit your markdown file as you work, reading this page for the descriptions of each section. You can build out a "stub file" with just headers, then gradually add content to each section. Use screenshots sparingly, only for complex UIs where it is difficult to describe a UI element with words. Refer to our [General Guidelines](../writing-documentation#general-guidelines) for writing tips and authentik-specific rules. +::: + Use a title that focuses on the feature, component, or technology you are writing about... for example, "About authentik polices" or "Understanding outposts". For conceptual docs, the verb in the title should indicate a concept, such as "About" or "Overview" or "Understanding", followed by the noun (the component or object you are writing about). In this first section, immediately after the title, write one or two sentences about the feature, component, or technology. The following sections can help break up the content. @@ -14,6 +24,12 @@ In this optional section, provide some example use cases for the feature. Who wo Dive deeper into explaining the concepts behind the feature/component. +Write about the feature/functionalilty from the user's perspective. What is this feature used for, why should they use it, are there situations where they should **_not_** use it? + > Pro Tip: If you were writing the related procedural topic, and you found that you had a lot to say about the topic, this is exactly where that info would go (not crowded up at the top of the procedural topic!). -Cover anything the user needs to know about the feature. If there are Reference docs for this feature or component, be sure to link to them from this page. +Cover anything the user needs to know about the feature. If there are Reference docs or a related procedural doc for this feature or component, be sure to link to them from this page. + +## Important considerations + +List anything that might be critical for user to know, such as situations where this feature might not be ideal, or pre-configs that need to be set, etc. diff --git a/website/developer-docs/docs/templates/conceptual.tmpl.md b/website/developer-docs/docs/templates/conceptual.tmpl.md new file mode 100644 index 000000000..d341cca5e --- /dev/null +++ b/website/developer-docs/docs/templates/conceptual.tmpl.md @@ -0,0 +1,21 @@ +--- +title: "Markdown template: conceptual" +--- + +Write a few sentences introducing the feature/component/technology. + +:::info +if needed, use this syntax to add a note (info) or warning (warning) +::: + +## Common use cases + +Provide a few use cases, with examples/scenarios when possible. + +## About feature x + +Provide more conceptual details. + +##Important considerations + +List anything users should know before implementing the feature/technology. diff --git a/website/developer-docs/docs/templates/index.md b/website/developer-docs/docs/templates/index.md index 11ee316f7..661e3d87f 100644 --- a/website/developer-docs/docs/templates/index.md +++ b/website/developer-docs/docs/templates/index.md @@ -7,7 +7,9 @@ In technical docuemntation, there are document "types" (similar to how there are The most common types are: - [**Procedural**](./procedural.md): these are How To docs, the HOW information, with step-by-step instructions for accomplishing a task. This is what most people are looking for when they open the docs... and best practice is to separate the procedural docs from long, lengthy conceptual or reference docs. -- [**Conceptual**](./conceptual.md): these docs provide the WHY information, and explain when to use a feature (or when not to!), and general concepts -- **Reference**: this is typically tables or lists of reference information, such as configuration values, or functions, or most commmonly APIs. + +- [**Conceptual**](./conceptual.md): these docs provide the WHY information, and explain when to use a feature (or when not to!), and general concepts behind the feature or functionality. + +- [**Reference**](./reference.md): this is typically tables or lists of reference information, such as configuration values, or functions, or most commmonly APIs. We have templates for the different types, to make it super-easy for whomever wants to contribute some documentation! diff --git a/website/developer-docs/docs/templates/procedural.md b/website/developer-docs/docs/templates/procedural.md index 53b3502cb..d05dda583 100644 --- a/website/developer-docs/docs/templates/procedural.md +++ b/website/developer-docs/docs/templates/procedural.md @@ -2,7 +2,17 @@ title: "Procedural topic" --- -Use a title that focuses on the task you are writing about... for example, "Add a new Group" or "Edit user profiles". For procedural docs, there should be a verb in the title, and usually the noun (the component or object you are working on). For the title (and all headings) use the infinitive form of the verb (i.e. "add") not the gerund form (i.e. "adding"). +:::info +**How to use this template**: start with the markdown version of the template, either by copying the [`procedural.tmpl.md`](https://github.com/goauthentik/authentik/tree/main/website/developer-docs/docs/templates) file from our GitHub repo or downloading the template file using the following command: + +``` +wget https://raw.githubusercontent.com/goauthentik/authentik/main/website/developer-docs/docs/templates/procedural.tmpl.md +``` + +Edit your markdown file as you work, reading this page for the descriptions of each section. You can build out a "stub file" with just headers, then gradually add content to each section. Use screenshots sparingly, only for complex UIs where it is difficult to describe a UI element with words. Refer to our [General Guidelines](../writing-documentation#general-guidelines) for writing tips and authentik-specific rules. +::: + +For a procedural topic, use a title that focuses on the task you are writing about. For example, "Add a new Group" or "Edit user profiles". For procedural docs, there should be a verb in the title, and usually the noun (the component or object you are working on). For the title (and all headings) use the infinitive form of the verb (i.e. "add") not the gerund form (i.e. "adding"). In this first section, right after the title, write one or two sentences about the task. Keep it brief; if it goes on too long, then create a separate conceptual topic, in a separate `.md` file. We don't want readers to have to scroll through paragraphs of conceptual info before they get to Step 1. @@ -14,7 +24,7 @@ In this section, inform the reader of anything they need to do, or have configur If the task is quite long or complex, it might be good to add a bullet list of the main steps, or even a diagram of the workflow, just so that the reader can first familairize themselves with the 50,000 meter view before they dive into the detailed steps. -## first several group steps +## First several group steps If the task involves a lot of steps, try to group them into similar steps and have a Head3 or Head4 title for each group. @@ -22,16 +32,16 @@ In this section, help the reader get oriented... where do they need to be (i.e. Have a separate paragraph for each step. -Start instructions with the desired outcome, followed by the instructions. +Start instructions with the desired goal, followed by the instructions. For example, in this sentence we first read the goal (to define a new port) and then we see the instructions: "To define a new port number, navigate to the Admin interface, and then to the **Settings** tab." -EXAMPLE: To define a new port number, navigate to the Admin interface, and then to the **Settings** tab. - -## next step of grouped steps +## Next step of grouped steps (if a second group is needed) Continue with the steps... Use screenshots sparingly, only for complex UIs where it is difficult to describe a UI element with words. -## verify the steps +Provide as many code snippets and examples as needed. -Whenever possible, it is useful to add verification steps at the end of a procedural topic. For example, if the procedural was about installing a product, use this section to tell them how they can verify that the install was successful. +## Verify the steps + +Use a heading such as "Verify your installation" or "Verify successful configuration". Whenever possible, it is useful to add verification steps at the end of a procedural topic. For example, if the procedural was about installing a product, use this section to tell them how they can verify that the install was successful. diff --git a/website/developer-docs/docs/templates/procedural.tmpl.md b/website/developer-docs/docs/templates/procedural.tmpl.md new file mode 100644 index 000000000..641ebb43c --- /dev/null +++ b/website/developer-docs/docs/templates/procedural.tmpl.md @@ -0,0 +1,35 @@ +--- +title: "Markdown template: procedural" +--- + +add brief description of the feature/functionality + +:::info +if needed, use this syntax to add a note (info) or warning (warning) +::: + +## Prerequisites + +bullet list of pre-reqs + +## Overview of steps/workflow + +describe the 50,000 meter view before they dive into the detailed steps, using a bullet list of the main steps, or even a diagram of the workflow. + +## first several group steps + +1. first step + +2. second step + +3. third step + +if you need a tabbed section to represent diff processes or code snippets for diff install environments, use an MDX tabbed component. + +## next step of grouped steps, if needed + +Continue with the steps... + +## verify the steps + +add verification steps diff --git a/website/developer-docs/docs/templates/reference.md b/website/developer-docs/docs/templates/reference.md index 50aaf4d85..ae455ec48 100644 --- a/website/developer-docs/docs/templates/reference.md +++ b/website/developer-docs/docs/templates/reference.md @@ -2,17 +2,25 @@ title: "Reference topic" --- +:::info +**How to use this template**: start with the markdown version of the template, either by copying the [`reference.tmpl.md`](https://github.com/goauthentik/authentik/tree/main/website/developer-docs/docs/templates) file from our GitHub repo or downloading the template file using the following command: + +``` +wget https://raw.githubusercontent.com/goauthentik/authentik/main/website/developer-docs/docs/templates/reference.tmpl.md +``` + +Edit your markdown file as you work, reading this page for the descriptions of each section. You can build out a "stub file" with just headers, then gradually add content to each section. Use screenshots sparingly, only for complex UIs where it is difficult to describe a UI element with words. Refer to our [General Guidelines](../writing-documentation#general-guidelines) for writing tips and authentik-specific rules. +::: + Create a title that specifies the component you are documenting. For example, "Group attributes". +Provide a sentence or two about the topic. + Reference documentation provides details, values, syntax, etc., about specific programming elements. The most common type of reference documentation is for REST APIs; the request syntax, a successful response, any parameters such as query, header, or request body parameters, and possible http status codes. -Other types of reference content include lists of functions, parameters, event actions, and attributes. - -## Overview - -Provide a sentence or two about the topic. +Other types of reference content include lists of functions, parameters, object properties, event actions, and attributes. ## Head 2 @@ -22,10 +30,10 @@ Use tables, bullet lists, Head3s... whatever you need to clearly present the val Be sure to use a sentence after every heading, to explain what the section is about, how the values are used, etc. -## Head 3 (optional, if needed) +### Head 3 (optional, if needed) Add a sentence explaining the following grouping. -## Head 3 (optional, if needed) +### Head 3 (optional, if needed) Add a sentence explaining the following grouping. diff --git a/website/developer-docs/docs/templates/reference.tmpl.md b/website/developer-docs/docs/templates/reference.tmpl.md new file mode 100644 index 000000000..caebd56fb --- /dev/null +++ b/website/developer-docs/docs/templates/reference.tmpl.md @@ -0,0 +1,19 @@ +--- +title: "Markdown template: reference" +--- + +Write a few sentences introducing the feature/component/technology, and state that this page contains refeerence materials. + +:::info +if needed, use this syntax to add a note (info) or warning (warning) +::: + +## Head 2 + +After a brief description of this section, list the reference values. + +Consider using a table if that is cleaner looking. + +### Head 3 (optional, if needed) + +After a brief description of this section, list the reference values. diff --git a/website/developer-docs/docs/writing-documentation.md b/website/developer-docs/docs/writing-documentation.md index d8c51559c..cd874207c 100644 --- a/website/developer-docs/docs/writing-documentation.md +++ b/website/developer-docs/docs/writing-documentation.md @@ -52,8 +52,8 @@ Be sure to run the formatter before committing changes. - When referring to UI text or UI components in authentik, use **bold** text. - When referring to other objects in authentik code or functionality, use _cursive_ text, and link to the corresponding documentation if possible. - When referring to external tools, give an example how to use the tools or explain how the user can use them. -- Make sure to add the documentation to add to the sidebar, if adding a new page. -- Test how the documentation renders using the Netlify Deploy Preview, especially when using Docusaurus-specific features. +- Make sure to add the documentation to the sidebar, if adding a new page. +- Test how the documentation renders using the Netlify Deploy Preview, especially when using Docusaurus-specific features. Or build it locally and test, using the `make website-watch` command. If you find any documentation that doesn't match these guidelines, feel free to either open an [Issue](https://github.com/goauthentik/authentik/issues) or a [PR](https://github.com/goauthentik/authentik/pulls) so they can be fixed. diff --git a/website/docs/enterprise/manage-enterprise.md b/website/docs/enterprise/manage-enterprise.md index b1f0eee7b..822c5cac2 100644 --- a/website/docs/enterprise/manage-enterprise.md +++ b/website/docs/enterprise/manage-enterprise.md @@ -113,6 +113,14 @@ License usage is calculated based on total user counts and log-in data data that An **internal** user is typically a team member, such as company employees, who gets access to the full Enterprise feature set. An **external** user might be an external consultant or a B2C customer who logged onto your website to shop. These users don't get access to enterprise features. ::: +### Upgrade the number of users in a license + +There are two ways to update the number of users in a license. + +You can either purchase a new license and enter it in the same authentik instance as the other one, in which case the total number of users in all your licenses is used to calculate the maximum number of users. However, this means that your licensing renewals will not happen at the same date. + +The second way is to [open a support ticket](./entsupport.md) with us and we'll upgrade the number of users in your license. You'll be charged the prorated amount for the remaining time until the next license renewal. + ## Manage Billing Billing is based on each individual organization. diff --git a/website/docs/index.mdx b/website/docs/index.mdx index aade68adc..94602f0ee 100755 --- a/website/docs/index.mdx +++ b/website/docs/index.mdx @@ -5,7 +5,7 @@ slug: / ## What is authentik? -authentik is an open-source Identity Provider, focused on flexibility and versatility. With authentik, site administrators, application developers, and security engineers a dependable and secure solution for authentication in almost any type of environment. There are robust recovery actions available for the users and applications, including user profile and password management. You can quickly edit, deactivate, or even impersonate a user profile, and set a new password for new users or reset an existing password. +authentik is an open-source Identity Provider, focused on flexibility and versatility. With authentik, site administrators, application developers, and security engineers have a dependable and secure solution for authentication in almost any type of environment. There are robust recovery actions available for the users and applications, including user profile and password management. You can quickly edit, deactivate, or even impersonate a user profile, and set a new password for new users or reset an existing password. You can use authentik in an existing environment to add support for new protocols, so introducing authentik to your current tech stack doesn't present re-architecting challenges. We already support all of the major providers, such as OAuth2, SAML, LDAP, and SCIM, so you can pick the protocol that you need for each application. diff --git a/website/docs/installation/configuration.md b/website/docs/installation/configuration.mdx similarity index 83% rename from website/docs/installation/configuration.md rename to website/docs/installation/configuration.mdx index 71d83fe13..7c4b7b531 100644 --- a/website/docs/installation/configuration.md +++ b/website/docs/installation/configuration.mdx @@ -2,12 +2,12 @@ title: Configuration --- -These are all the configuration options you can set via environment variables. +This page details all the authentik configuration options that you can set via environment variables. -Append any of the following keys to your `.env` file, and run `docker-compose up -d` to apply them. +## About authentik configurations :::info -The double-underscores are intentional, as all these settings are translated to yaml internally, a double-underscore indicates the next level. +The double-underscores are intentional, as all these settings are translated to YAML internally, and a double-underscore indicates the next level (a subsetting). ::: All of these variables can be set to values, but you can also use a URI-like format to load values from other places: @@ -15,15 +15,45 @@ All of these variables can be set to values, but you can also use a URI-like for - `env://` Loads the value from the environment variable ``. Fallback can be optionally set like `env://?` - `file://` Loads the value from the file ``. Fallback can be optionally set like `file://?` -## Checking settings +## Set your environment variables + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + + + + If you are using Docker Compose, edit your .env file to append any keys that you want to add, and then run the following command to apply them: + + docker-compose up -d + + + + If you are running in Kubernetes, edit your values.yaml file to append any keys that you want to add, and then run the following commands to apply: + + helm repo update + helm upgrade --install authentik authentik/authentik -f values.yaml + + + + + +## Verify your configuration settings To check if your config has been applied correctly, you can run the following command to output the full config: -``` -docker-compose run --rm worker dump_config -# Or for kubernetes -kubectl exec -it deployment/authentik-worker -c authentik -- ak dump_config -``` + + + + docker-compose run --rm worker dump_config + + + + + kubectl exec -it deployment/authentik-worker -c authentik -- ak dump_config + + + + ## PostgreSQL Settings @@ -51,15 +81,19 @@ kubectl exec -it deployment/authentik-worker -c authentik -- ak dump_config - `AUTHENTIK_REDIS__CACHE_TIMEOUT_POLICIES`: Timeout for cached policies until they expire in seconds, defaults to 300 - `AUTHENTIK_REDIS__CACHE_TIMEOUT_REPUTATION`: Timeout for cached reputation until they expire in seconds, defaults to 300 + :::info + `AUTHENTIK_REDIS__CACHE_TIMEOUT_REPUTATION` only applies to the cache expiry, see [`AUTHENTIK_REPUTATION__EXPIRY`](#authentik_reputation__expiry) to control how long reputation is persisted for. + ::: + ## Listen Setting -- `AUTHENTIK_LISTEN__HTTP`: Listening address:port (e.g. `0.0.0.0:9000`) for HTTP (Server and Proxy outpost) -- `AUTHENTIK_LISTEN__HTTPS`: Listening address:port (e.g. `0.0.0.0:9443`) for HTTPS (Server and Proxy outpost) -- `AUTHENTIK_LISTEN__LDAP`: Listening address:port (e.g. `0.0.0.0:3389`) for LDAP (LDAP outpost) -- `AUTHENTIK_LISTEN__LDAPS`: Listening address:port (e.g. `0.0.0.0:6636`) for LDAPS (LDAP outpost) -- `AUTHENTIK_LISTEN__METRICS`: Listening address:port (e.g. `0.0.0.0:9300`) for Prometheus metrics (All) -- `AUTHENTIK_LISTEN__DEBUG`: Listening address:port (e.g. `0.0.0.0:9900`) for Go Debugging metrics (All) -- `AUTHENTIK_LISTEN__TRUSTED_PROXY_CIDRS`: List of CIDRs that proxy headers should be accepted from (Server) +- `AUTHENTIK_LISTEN__HTTP`: Listening address:port (e.g. `0.0.0.0:9000`) for HTTP (Applies to Server and Proxy outpost) +- `AUTHENTIK_LISTEN__HTTPS`: Listening address:port (e.g. `0.0.0.0:9443`) for HTTPS (Applies to Server and Proxy outpost) +- `AUTHENTIK_LISTEN__LDAP`: Listening address:port (e.g. `0.0.0.0:3389`) for LDAP (Applies to LDAP outpost) +- `AUTHENTIK_LISTEN__LDAPS`: Listening address:port (e.g. `0.0.0.0:6636`) for LDAPS (Applies to LDAP outpost) +- `AUTHENTIK_LISTEN__METRICS`: Listening address:port (e.g. `0.0.0.0:9300`) for Prometheus metrics (Applies to All) +- `AUTHENTIK_LISTEN__DEBUG`: Listening address:port (e.g. `0.0.0.0:9900`) for Go Debugging metrics (Applies to All) +- `AUTHENTIK_LISTEN__TRUSTED_PROXY_CIDRS`: List of CIDRs that proxy headers should be accepted from (Applies to Server) Defaults to `127.0.0.0/8`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `fe80::/10`, `::1/128`. @@ -297,6 +331,16 @@ Allows configuration of TLS Cliphers for LDAP connections used by LDAP sources. Defaults to `null`. +### `AUTHENTIK_REPUTATION__EXPIRY` + +:::info +Requires authentik 2023.8.2 +::: + +Configure how long reputation scores should be saved for in seconds. Note that this is different than [`AUTHENTIK_REDIS__CACHE_TIMEOUT_REPUTATION`](#redis-settings), as reputation is saved to the database every 5 minutes. + +Defaults to `86400`. + ### `AUTHENTIK_WEB__WORKERS` :::info diff --git a/website/docs/outposts/integrations/docker.md b/website/docs/outposts/integrations/docker.md index 127d9b446..8c779b935 100644 --- a/website/docs/outposts/integrations/docker.md +++ b/website/docs/outposts/integrations/docker.md @@ -9,7 +9,7 @@ This integration has the advantage over manual deployments of automatic updates The following outpost settings are used: - `object_naming_template`: Configures how the container is called -- `container_image`: Optionally overwrites the standard container image (see [Configuration](../../installation/configuration.md#authentik_outposts) to configure the global default) +- `container_image`: Optionally overwrites the standard container image (see [Configuration](../../installation/configuration.mdx#authentik_outposts) to configure the global default) - `docker_network`: The Docker network the container should be added to. This needs to be modified if you plan to connect to authentik using the internal hostname. - `docker_map_ports`: Enable/disable the mapping of ports. When using a proxy outpost with Traefik for example, you might not want to bind ports as they are routed through Traefik. - `docker_labels`: Optional additional labels that can be applied to the container. diff --git a/website/docs/outposts/integrations/kubernetes.md b/website/docs/outposts/integrations/kubernetes.md index 4c2bf274c..0a94f9893 100644 --- a/website/docs/outposts/integrations/kubernetes.md +++ b/website/docs/outposts/integrations/kubernetes.md @@ -18,7 +18,7 @@ This integration creates the following objects: The following outpost settings are used: - `object_naming_template`: Configures how the container is called -- `container_image`: Optionally overwrites the standard container image (see [Configuration](../../installation/configuration.md) to configure the global default) +- `container_image`: Optionally overwrites the standard container image (see [Configuration](../../installation/configuration.mdx) to configure the global default) - `kubernetes_replicas`: Replica count for the deployment of the outpost - `kubernetes_namespace`: Namespace to deploy in, defaults to the same namespace authentik is deployed in (if available) - `kubernetes_ingress_annotations`: Any additional annotations to add to the ingress object, for example cert-manager diff --git a/website/docs/releases/2023/v2023.2.md b/website/docs/releases/2023/v2023.2.md index fbf66a4f2..d5d66f68f 100644 --- a/website/docs/releases/2023/v2023.2.md +++ b/website/docs/releases/2023/v2023.2.md @@ -21,7 +21,7 @@ slug: "/releases/2023.2" - Generated avatars, multiple avatar modes - authentik now supports multiple avatar modes, and will use the next configured mode when a mode doesn't have an avatar. For example, the new default configuration attempts to use gravatar, but if the user's email does not have a gravatar setup, it will instead use the new generated avatars. See [Configuration](../../installation/configuration.md#authentik_avatars) + authentik now supports multiple avatar modes, and will use the next configured mode when a mode doesn't have an avatar. For example, the new default configuration attempts to use gravatar, but if the user's email does not have a gravatar setup, it will instead use the new generated avatars. See [Configuration](../../installation/configuration.mdx#authentik_avatars) ## Upgrading diff --git a/website/docs/releases/2023/v2023.8.md b/website/docs/releases/2023/v2023.8.md index 0e992cb0c..7c805ae83 100644 --- a/website/docs/releases/2023/v2023.8.md +++ b/website/docs/releases/2023/v2023.8.md @@ -124,6 +124,37 @@ image: - web: fix notification drawer scrolling (#6675) - web/admin: fix version link to release notes (#6676) +## Fixed in 2023.8.2 + +- core: make groups' parent_name nullable as it might not be set (#6700) +- crypto: fix certificate has_key filter (#6727) +- events: fix missing application names from most used applications (#6689) +- policies/reputation: fix reputation not expiring (#6714) +- providers/oauth2: fix incorrect scope permissions shown (#6696) +- providers/saml: fix SAML metadata import API requiring flow slug inst… (#6729) +- root: expand exception logging (#6690) +- web/admin: clear other options depending on what the binding targets (#6703) +- web/admin: fix ak-toggle-group for policy and blueprint uses (#6687) + +## Fixed in 2023.8.3 + +- core: bump celery from 5.3.1 to 5.3.4 +- core: bump django from 4.2.4 to 4.2.5 (#6751) +- core: remove celery's duplicate max_tasks_per_child (#6840) +- policies/reputation: require either check to be enabled (#6764) +- providers/scim: check that a provider exists before starting scim task (#6841) +- root: fix broken celery dependency (#6744) +- root: lock node to 20.5 (#6776) +- sources/ldap: dont prefetch useless items (#6812) +- sources/ldap: fix FreeIPA nsaccountlock sync (#6745) +- sources/ldap: fix task timeout for ldap_sync_all and ldap_sync_single (#6809) +- stages/password: fix failed_attempts_before_cancel allowing one too m… (#6763) +- web/admin: fix application icon size (#6738) +- web/admin: fix not being able to unset flows (#6838) +- web/admin: fix not being able to unset certificates (#6767) +- web: don't import entire SourceViewPage in flow and user interface (#6761) +- web: replace ampersand (#6737) + ## API Changes #### What's New diff --git a/website/docs/user-group/user.md b/website/docs/user-group/user.md index 369205bea..6651b7cf2 100644 --- a/website/docs/user-group/user.md +++ b/website/docs/user-group/user.md @@ -2,6 +2,46 @@ title: User --- +## Object properties + +The User object has the following properties: + +- `username`: User's username. +- `email` User's email. +- `uid` User's unique ID +- `name` User's display name. +- `is_staff` Boolean field if user is staff. +- `is_active` Boolean field if user is active. +- `date_joined` Date user joined/was created. +- `password_change_date` Date password was last changed. +- `path` User's path, see [Path](#path) +- `attributes` Dynamic attributes, see [Attributes](#attributes) +- `group_attributes()` Merged attributes of all groups the user is member of and the user's own attributes. +- `ak_groups` This is a queryset of all the user's groups. + + You can do additional filtering like + + ```python + user.ak_groups.filter(name__startswith='test') + ``` + + see [here](https://docs.djangoproject.com/en/3.1/ref/models/querysets/#id4) + + To get the name of all groups, you can do + + ```python + [group.name for group in user.ak_groups.all()] + ``` + +## Examples + +List all the User's group names: + +```python +for group in user.ak_groups.all(): + yield group.name +``` + ## Path :::info @@ -53,42 +93,3 @@ additionalHeaders: ``` These headers will now be passed to the application when the user logs in. Most applications will need to be configured to accept these headers. Some examples of applications that can accept additional headers from an authentik Proxy Provider are [Grafana](https://grafana.com/docs/grafana/latest/auth/auth-proxy/) and [Tandoor Recipes](https://docs.tandoor.dev/features/authentication/). - -## Object attributes - -The User object has the following attributes: - -- `username`: User's username. -- `email` User's email. -- `uid` User's unique ID -- `name` User's display name. -- `is_staff` Boolean field if user is staff. -- `is_active` Boolean field if user is active. -- `date_joined` Date user joined/was created. -- `password_change_date` Date password was last changed. -- `attributes` Dynamic attributes, see above -- `group_attributes()` Merged attributes of all groups the user is member of and the user's own attributes. -- `ak_groups` This is a queryset of all the user's groups. - - You can do additional filtering like - - ```python - user.ak_groups.filter(name__startswith='test') - ``` - - see [here](https://docs.djangoproject.com/en/3.1/ref/models/querysets/#id4) - - To get the name of all groups, you can do - - ```python - [group.name for group in user.ak_groups.all()] - ``` - -## Examples - -List all the User's group names: - -```python -for group in user.ak_groups.all(): - yield group.name -``` diff --git a/website/package-lock.json b/website/package-lock.json index 3fe80746f..934e236af 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -22,7 +22,7 @@ "react-dom": "^17.0.2", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.21.1", + "react-tooltip": "^5.21.4", "remark-github": "^11.2.4" }, "devDependencies": { @@ -10591,9 +10591,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.1.tgz", - "integrity": "sha512-wJqF/yzK1wuJuy5/zAkVErFA609fVv1ZukhGjw44PcMvg9wL0jomnpQyz3qH1H7TWjz/wqO/OMc3ipQNjZ8zYg==", + "version": "5.21.4", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.4.tgz", + "integrity": "sha512-LZsllEbiu63zNwuCalq3gIFcBu2Xf0I0fMg7uuF7/5ROo5//uHe8Sum7v9L1Rtp6IozcoU9YAjkNUZdrxutsNg==", "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" @@ -21361,9 +21361,9 @@ } }, "react-tooltip": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.1.tgz", - "integrity": "sha512-wJqF/yzK1wuJuy5/zAkVErFA609fVv1ZukhGjw44PcMvg9wL0jomnpQyz3qH1H7TWjz/wqO/OMc3ipQNjZ8zYg==", + "version": "5.21.4", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.4.tgz", + "integrity": "sha512-LZsllEbiu63zNwuCalq3gIFcBu2Xf0I0fMg7uuF7/5ROo5//uHe8Sum7v9L1Rtp6IozcoU9YAjkNUZdrxutsNg==", "requires": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" diff --git a/website/package.json b/website/package.json index 654488d7c..291cd0d6f 100644 --- a/website/package.json +++ b/website/package.json @@ -29,7 +29,7 @@ "react-dom": "^17.0.2", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.21.1", + "react-tooltip": "^5.21.4", "remark-github": "^11.2.4" }, "browserslist": { diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 65f97ab56..aec8cb4ef 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -135,6 +135,3 @@ body { .navbar-sidebar__items { background-color: var(--ifm-color-primary); } -.navbar-sidebar__items .menu__link { - color: var(--white); -} diff --git a/website/src/pages/index.jsx b/website/src/pages/index.jsx index c9542b0aa..feea2b292 100644 --- a/website/src/pages/index.jsx +++ b/website/src/pages/index.jsx @@ -63,8 +63,8 @@ function Home() {
    with a unified platform.

    - authentik is an open-source Identity Provider - focused on flexibility and versatility + Unify all of your identity needs into a single + platform

    authentik logo
    diff --git a/website/static/img/landing_login_card.jpg b/website/static/img/landing_login_card.jpg deleted file mode 100644 index baed44eae..000000000 Binary files a/website/static/img/landing_login_card.jpg and /dev/null differ diff --git a/website/static/img/landing_login_card.png b/website/static/img/landing_login_card.png new file mode 100644 index 000000000..b070b6074 Binary files /dev/null and b/website/static/img/landing_login_card.png differ