From b3b7a59a6cfe44e7e5afc45572c8f8f4c13966c4 Mon Sep 17 00:00:00 2001 From: Lucas Rodriguez Date: Wed, 15 Nov 2023 10:25:21 -0600 Subject: [PATCH] Initial setup for repo (#1) * Initial setup * Add workflow for init package and add EKS package * Add script to create IAM roles for IRSA auth in workflow * Remove command to remove tmpdir * Add PR as workflow trigger * Install same version of Go that Zarf users * Fix sed command and update github actions output syntax * Update ecr bootstrap script * Switch to using bash for ecr bootstrap script to use an array * Update readme header * Use gsed for mac in iam bootstrap script for local testing * Fetch pepr pod logs onFailure * Dynamically set AWS account ID in iam script * Specify pepr-system namespace in kubectl logs * Update the way github outputs are set * Fix github outputs * Update run syntax in workflow * Remove onFailure action from package * Rename bootstrap directory to hack to align with k8s convention * Run tests for private and public ECR registry in parallel * Fix zarf command in teardown step * Create build dir before moving zarf binary to it * Use sudo to add exec permissions to zarf binary * Fix cluster name input * Download latest zarf rc version instead of build from source * Move zarf binary to build dir * Specify multiple availability zones for EKS cluster * Add single quotes * Change AZ in EKS config * Remove availability zones * Use setup-zarf action to install zarf binary * Import zarf-agent via init skeleton package * Remove local zarf-agent package * Run zarf init from build directory * Specify availability zones in eks config file to avoid capacity error * Add comment for context about specifying AZs in eks config * Add zarf as prereq to README.md * Update Pepr to v0.14.0 Refactor ECR capability to use new K8s fluent client Split ECR capability up into separate files for private and public APIs * Remove unused make targets for zarf agent * Rebuild Pepr module for changes to take effect * Use zarf vars directly in ECR bootstrap script * Empty commit to trigger workflows * Update docs and Makefile and format module * Update Watch() back to Mutate() * Remove npm ci from build and test make targets * Add a workaround for updating webhook status in package secret Pepr fluent client does not currently support force Apply() Workaround is to clear managedFields and updated webhook status in a single Patch request * Replace IAM role shell script with pulumi typescript program * Install NodeJS and deps in workflow * Add CODEOWNERS file * Add issue templates * Add pull request template * Refactor cluster teardown in EKS package * Update EKS package version in deploy command * Move onRemove action for EKS cluster into single package component Refactor directory structure for pulumi program * Fix filepath to IAM JSON files in pulumi module Add make targets for deploying and removing EKS package * Update Pepr to 0.14.1 Replace Patch with Force Apply to update package secret in webhook Ensure Pepr module is rebuilt in the build job * Specify package-lock.json in root of repo as cache path * Include ts files only in capabilities dir in tsconfig to fix error in CI Remove ./ syntax in npm cache path * Add git-server as optional component to init package * Add workflow to run unit tests for Pepr module Refactor getRepositoryNames() in Pepr module to handle images with digest ref Add test case to unit tests to validate handling of images with digest * Add renovate.json config file * Bump eksctl version to v0.162.0 * Add ADR for using Pulumi TypeScript SDK * Add OpenSSF Scorecard workflow * Downgrade eksctl to v0.160.0 due to goroutine race condition bug * Add option to locally build credential helper image * Install Go in build job to build credential helper binary * Rename openssf scorecard workflow to scorecard.yml * Fix numbered list in ADR * Move zarf init options/vars to zarf-config.toml Update README.md * Uncomment log_level in zarf-config.toml * Run zarf init command for public ECR test from root of repo * Update README.md * Remove docker build command comment from Dockerfile * Remove components from zarf config file to fix cluster teardown * Update dependencies and add workflow to scan CVEs * Install Zarf binary in scan-cves workflow to generate SBOM * Add revive lint workflow for Go CronJob * Add comment to .gype.yaml about false positive for x/net pkg * Fix linting errors * Add scan-labels workflow * Add codeql workflow and config file * Add step to build Go binary in scan-codeql workflow * Update @babel/core package to 7.23.2 to patch critical CVE-2023-45133 * Rebuilt pepr module after updating deps * Moves credential-helper src code to root of repo Exclude ./binaries directory from grype scan Grype was detecting CVEs in the eksctl binaries in ./binaries directory Since the scan now excludes the directory, there are no vulns found This allows us to be able to comment out the .grype.yaml file Adds cve-report make target * Add release workflow * Update development.md doc * Expose Cron schedule as deploy-time variable Default set to run once every hour at the beginning of the hour * Remove version field from zarf.yaml * Remove slack notification steps from aws init package workflow This workflow is set to run on every PR commit, which would make for a noisy slack channel * Fix publish package make target in release workflow * Update permissions needed for AWS CLI in README prereqs * Remove step to deploy workfloads into the cluster from README * Remove setup go step from scan-cves workflow * Add setup-go and build binary steps to release workflow Update publish pkg make target to use zarf version for init pkg name Comment out step to sign the image and add a TODO to setup repo secrets for cosign * Update .github/ISSUE_TEMPLATE/bug_report.md Co-authored-by: razzle * Update .github/ISSUE_TEMPLATE/feature_request.md Co-authored-by: razzle * Update .github/ISSUE_TEMPLATE/tech_debt.md Co-authored-by: razzle * Update .github/ISSUE_TEMPLATE/ux_test.md Co-authored-by: razzle * Update .github/workflows/scan-lint.yml Co-authored-by: razzle * Update README.md Co-authored-by: razzle * Add typescript to codql workflow language matrix * Update Node.js to version 20 in workflows * Update pulumi and pulumi/aws packages Remove .grype.yaml file due to no CVEs being ignored Update test-cves make target to not exclude iam/ dir from scanning * Include all package.json and package-lock.json paths in scan-cves workflow * Remove needs-tutorial label from banned labels in scan-labels workflow * Add cons to pulumi typescript SDK in ADR * Move zarf init command and delete repos commands to make targets Use ZARF_CONFIG env var to use config file instead of moving init package * Fix make targets for deleting ECR repos Makefiles use /bin/sh by default which does not support arrays * Remove array assignment from make target * Add make target for linting typescript code in the repo Add step to scan-lint workflow to lint typescript code * Update development.md doc * Rename var in ECRPublic class to be less redundant * Add return statement to end execution in isECRregistry() Previously we were only logging a warning message if Zarf is configured to use an internal registry. This behavior has been changed to log a warning a message and return if using an internal registry * Throw an error if input images array is null in getRepositoryNames() * Call readFileSync() method directly in IaC * Use context.WithTimeout() to prevent binary from waiting forever * Exclude binaries directory from CVE scan * Remove images field from DeployedComponent interface * Add build/ dir to ignorePatterns in .eslintrc.json * Add comments to typescript code and update package.json description * Split logic into functions and separate into modules * Update Pepr to v0.14.2 * Update node dependencies * Update pepr manifest * Update node deps for pulumi IaC * Add link to docs and regex101 for public ECR URL pattern * Add link to docs and regex101 for private ECR pattern * Format and rebuild module * Change zarf-config.toml to zarf-config.yaml Part of the local dev and ci workflow is to programatically update this config file There are much better parsing libs for yaml than toml for node so switched to yaml Updates the update-zarf-config.mjs script to use yaml parser lib instead of regex * Update README.md to use yaml config file * Update README.md * Update eksctl version and ebs driver version in EKS package * Update zarf config file * Update eks package and makefile * Update update-zarf-config.mjs script Use parseDocument and toString methods to preserve blank lines and comments Use has, get, and set methods to safely update the YAML config file * Add a package.json file to manage yaml dep in .mjs script Move to hack/update-zarf-config dir * Add make target to install node deps in every package.json in the repo Run this make target in both validate ecr jobs * Stop tracking zarf-config.yaml in git history * Update update-zarf-config script to make a new copy of the update file git ignore the generated zarf-config.yaml file This reduces the likelihood of commiting an auto-updated config file * Add a system/workflow to keep ts interfaces in sync with Zarf structs * Add root go.mod to workspace and rename nested go.mod * Update pepr manifest * Add make target to ensure build dir exists for cve report * Update indirect deps to resolve CVEs * Update pulumi deps * Add Go grpc CVE to grype ignore file * Simplify gen-schema script Removes cobra as a dependency We are running go run main.go so cobra is not needed * Fix lint errors in gen-schema script * Fix go run command in gen-schema.sh * Change let to const in update-zarf-config script * Use handlebars to update IAM role placeholders instead of regex * Run make format-ts * Add comments to explain update-zarf-config script * Update image ref parsing * Update Zarf version to v0.31.0 Update Go deps * Update Pepr to v0.15.0 * Run make gen-schema and rebuild module * Fix Zarf config file in README.md * Use us-west-2 region for EKS clusters * Update AWS region in IAM roles to us-west-2 for EKS OIDC * Specify AWS region in eksctl write-kubeconfig cmd in EKS pkg * Specify us-west-2 region in Pulumi.yaml project config * Add metadata.version to zarf.yaml * Update README.md to not hard code the version in the init pkg name * Remove metadata.version from zarf.yaml * Add ZARF_CONFIG env var to release-aws-init-package make target * Add zarf-sbom dir to .gitignore * Update .github/ISSUE_TEMPLATE/tech_debt.md Co-authored-by: Wayne Starr * Remove extra char in .grype.yaml * Add contributing guide that points to the Zarf contributing guide --------- Co-authored-by: razzle Co-authored-by: Wayne Starr --- .eslintrc.json | 25 + .github/ISSUE_TEMPLATE/bug_report.md | 30 + .github/ISSUE_TEMPLATE/feature_request.md | 25 + .github/ISSUE_TEMPLATE/tech_debt.md | 19 + .github/ISSUE_TEMPLATE/ux_test.md | 26 + .github/codeql.yaml | 6 + .github/pull_request_template.md | 20 + .github/workflows/release.yml | 75 + .github/workflows/scan-codeql.yml | 66 + .github/workflows/scan-cves.yml | 30 + .github/workflows/scan-gen-schema.yml | 23 + .github/workflows/scan-labels.yml | 15 + .github/workflows/scan-lint.yml | 30 + .github/workflows/scorecard.yml | 50 + .github/workflows/test-aws-init-package.yml | 213 + .github/workflows/test-pepr-module.yml | 40 + .gitignore | 11 + .grype.yaml | 4 + .prettierrc | 13 + CODEOWNERS | 5 + CONTRIBUTING.md | 3 + Dockerfile | 8 + Makefile | 160 + README.md | 127 +- ...pescript-sdk-to-provision-iam-resources.md | 109 + adr/template.md | 19 + capabilities/ecr-private.ts | 104 + capabilities/ecr-provider.ts | 7 + capabilities/ecr-public.ts | 95 + capabilities/lib/ecr.ts | 115 + capabilities/lib/utils.test.ts | 96 + capabilities/lib/utils.ts | 252 + capabilities/webhook.ts | 90 + capabilities/zarf-types.ts | 1457 +++ docs/development.md | 96 + go.mod | 54 + go.sum | 175 + go.work | 6 + go.work.sum | 636 ++ hack/.templates/grype.tmpl | 4 + hack/ecr.sh | 37 + hack/gen-schema/check-gen-schema.sh | 9 + hack/gen-schema/gen-schema.sh | 4 + hack/gen-schema/go.mod | 74 + hack/gen-schema/go.sum | 241 + hack/gen-schema/main.go | 26 + hack/update-zarf-config/index.mjs | 53 + hack/update-zarf-config/package-lock.json | 23 + hack/update-zarf-config/package.json | 9 + iam/Pulumi.yaml | 5 + iam/index.ts | 86 + iam/json/ecr-credential-helper-policy.json | 13 + iam/json/ecr-credential-helper-role.json | 17 + iam/json/ecr-webhook-policy.json | 15 + iam/json/ecr-webhook-role.json | 17 + iam/package-lock.json | 2227 +++++ iam/package.json | 12 + iam/tsconfig.json | 18 + iam/utils.ts | 72 + jest.config.json | 4 + main.go | 155 + manifests/kustomization.yaml | 7 + manifests/patches/add-env-var.patch.yaml | 16 + .../add-service-account-annotation.patch.yaml | 7 + .../patches/replace-image-ref.patch.yaml | 14 + ...-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml | 279 + manifests/zarf-ecr-credential-helper.yaml | 57 + package-lock.json | 8025 +++++++++++++++++ package.json | 39 + packages/eks/eks.yaml | 23 + packages/eks/zarf.yaml | 67 + pepr.ts | 10 + renovate.json | 74 + revive.toml | 31 + tsconfig.json | 23 + types.go | 19 + zarf-config.example.yaml | 36 + zarf.yaml | 92 + 78 files changed, 16273 insertions(+), 2 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/tech_debt.md create mode 100644 .github/ISSUE_TEMPLATE/ux_test.md create mode 100644 .github/codeql.yaml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/scan-codeql.yml create mode 100644 .github/workflows/scan-cves.yml create mode 100644 .github/workflows/scan-gen-schema.yml create mode 100644 .github/workflows/scan-labels.yml create mode 100644 .github/workflows/scan-lint.yml create mode 100644 .github/workflows/scorecard.yml create mode 100644 .github/workflows/test-aws-init-package.yml create mode 100644 .github/workflows/test-pepr-module.yml create mode 100644 .gitignore create mode 100644 .grype.yaml create mode 100644 .prettierrc create mode 100644 CODEOWNERS create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md create mode 100644 adr/template.md create mode 100644 capabilities/ecr-private.ts create mode 100644 capabilities/ecr-provider.ts create mode 100644 capabilities/ecr-public.ts create mode 100644 capabilities/lib/ecr.ts create mode 100644 capabilities/lib/utils.test.ts create mode 100644 capabilities/lib/utils.ts create mode 100644 capabilities/webhook.ts create mode 100644 capabilities/zarf-types.ts create mode 100644 docs/development.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 go.work create mode 100644 go.work.sum create mode 100644 hack/.templates/grype.tmpl create mode 100755 hack/ecr.sh create mode 100755 hack/gen-schema/check-gen-schema.sh create mode 100755 hack/gen-schema/gen-schema.sh create mode 100644 hack/gen-schema/go.mod create mode 100644 hack/gen-schema/go.sum create mode 100644 hack/gen-schema/main.go create mode 100644 hack/update-zarf-config/index.mjs create mode 100644 hack/update-zarf-config/package-lock.json create mode 100644 hack/update-zarf-config/package.json create mode 100644 iam/Pulumi.yaml create mode 100644 iam/index.ts create mode 100644 iam/json/ecr-credential-helper-policy.json create mode 100644 iam/json/ecr-credential-helper-role.json create mode 100644 iam/json/ecr-webhook-policy.json create mode 100644 iam/json/ecr-webhook-role.json create mode 100644 iam/package-lock.json create mode 100644 iam/package.json create mode 100644 iam/tsconfig.json create mode 100644 iam/utils.ts create mode 100644 jest.config.json create mode 100644 main.go create mode 100644 manifests/kustomization.yaml create mode 100644 manifests/patches/add-env-var.patch.yaml create mode 100644 manifests/patches/add-service-account-annotation.patch.yaml create mode 100644 manifests/patches/replace-image-ref.patch.yaml create mode 100644 manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml create mode 100644 manifests/zarf-ecr-credential-helper.yaml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/eks/eks.yaml create mode 100644 packages/eks/zarf.yaml create mode 100644 pepr.ts create mode 100644 renovate.json create mode 100644 revive.toml create mode 100644 tsconfig.json create mode 100644 types.go create mode 100644 zarf-config.example.yaml create mode 100644 zarf.yaml diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..1a9c8d1 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "env": { + "browser": false, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022 + }, + "plugins": [ + "@typescript-eslint" + ], + "ignorePatterns": [ + "node_modules", + "dist", + "hack", + "build", + "capabilities/zarf-types.ts" + ], + "root": true +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..b538e3f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: possible-bug +assignees: '' +--- + +### Environment + +Device and OS: +App version: +Kubernetes distro being used: +Other: + +### Steps to reproduce + +1. + +### Expected result + +### Actual Result + +### Visual Proof (screenshots, videos, text, etc) + +### Severity/Priority + +### Additional Context + +Add any other context or screenshots about the technical debt here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..c6359ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,25 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' +--- + +### Is your feature request related to a problem? Please describe. + +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like + +- **Given** a state +- **When** an action is taken +- **Then** something happens + +### Describe alternatives you've considered + +(optional) A clear and concise description of any alternative solutions or features you've considered. + +### Additional context + +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/tech_debt.md b/.github/ISSUE_TEMPLATE/tech_debt.md new file mode 100644 index 0000000..a1f8539 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/tech_debt.md @@ -0,0 +1,19 @@ +--- +name: Tech debt +about: Record something that should be investigated or refactored in the future. +title: '' +labels: 'tech-debt' +assignees: '' +--- + +### Describe what should be investigated or refactored + +A clear and concise description of what should be changed/researched. Ex. This piece of the code is not DRY enough [...] + +### Links to any relevant code + +(optional) i.e. - + +### Additional context + +Add any other context or screenshots about the technical debt here. diff --git a/.github/ISSUE_TEMPLATE/ux_test.md b/.github/ISSUE_TEMPLATE/ux_test.md new file mode 100644 index 0000000..3039f66 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ux_test.md @@ -0,0 +1,26 @@ +--- +name: UX Test +about: Record something that should be investigated to test User Experience +title: '' +labels: 'ux' +assignees: '' +--- + +## Driving Questions + +What are we hoping to validate? + +## Testing Plan + +User Persona: +Sample Group: + +- [ ] Use Checklist for Tasks + +## Additional context + +Add any other context or screenshots about the UX test here. + +Related to issue: # + +## Link to Test & Results diff --git a/.github/codeql.yaml b/.github/codeql.yaml new file mode 100644 index 0000000..71c4bdf --- /dev/null +++ b/.github/codeql.yaml @@ -0,0 +1,6 @@ +paths-ignore: + - build/** + +query-filters: + - exclude: + id: go/path-injection diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..81229b5 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## Description + +... + +## Related Issue + +Fixes # + +Relates to # + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Other (security config, docs update, etc) + +## Checklist before merging + +- [ ] Test, docs, adr added or updated as needed +- [ ] [Contributor Guide Steps](https://github.com/defenseunicorns/zarf-init-aws/blob/main/CONTRIBUTING.md) followed diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0914367 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: Publish Zarf Init Package for AWS on Tag + +permissions: + contents: read + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + permissions: + packages: write + contents: write + steps: + # Checkout the repo and setup the tooling for this job + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + fetch-depth: 0 + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Install tools + uses: defenseunicorns/zarf/.github/actions/install-tools@main + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Build ECR credential-helper binary + run: make build-credential-helper-linux-amd + + - name: "ECR Credential Helper: Login to GHCR" + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: dummy + password: ${{ github.token }} + + - name: "ECR Credential Helper: Build and Publish the Image" + run: docker buildx build --push --platform linux/amd64 --tag ghcr.io/defenseunicorns/zarf-init-aws/ecr-credential-helper:$GITHUB_REF_NAME . + + # TODO@jeff-mccoy: Setup cosign signing key secrets in repo + # - name: "ECR Credential Helper: Sign the Image" + # run: cosign sign --key awskms:///${{ secrets.COSIGN_AWS_KMS_KEY }} -a release-engineer=https://github.com/${{ github.actor }} -a version=$GITHUB_REF_NAME ghcr.io/defenseunicorns/zarf-init-aws/ecr-credential-helper:$GITHUB_REF_NAME + # env: + # COSIGN_EXPERIMENTAL: 1 + # AWS_REGION: ${{ secrets.COSIGN_AWS_REGION }} + # AWS_ACCESS_KEY_ID: ${{ secrets.COSIGN_AWS_KEY_ID }} + # AWS_SECRET_ACCESS_KEY: ${{ secrets.COSIGN_AWS_ACCESS_KEY }} + + - name: Build AWS init package for release + run: make release-aws-init-package CREDENTIAL_HELPER_IMAGE_TAG=$GITHUB_REF_NAME + + - name: Publish AWS Init Package as OCI and Skeleton + run: make publish-aws-init-package ARCH=amd64 REPOSITORY_URL=ghcr.io/defenseunicorns/packages + + # Create a CVE report based on this build + - name: Create release time CVE report + run: make cve-report + + - name: Save CVE report + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: cve-report + path: build/zarf-known-cves.csv + + # Create GitHub release and upload the AWS init package as a release artifact + - name: Create GitHub release and upload AWS init package as release artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN}} + run: gh release create "$GITHUB_REF_NAME" ./build/zarf-init-*.tar.zst --generate-notes --verify-tag diff --git a/.github/workflows/scan-codeql.yml b/.github/workflows/scan-codeql.yml new file mode 100644 index 0000000..eb93240 --- /dev/null +++ b/.github/workflows/scan-codeql.yml @@ -0,0 +1,66 @@ +name: Analyze CodeQL + +permissions: + contents: read + +on: + push: + branches: ["main"] + pull_request: + paths-ignore: + - "**.md" + - "**.jpg" + - "**.png" + - "**.gif" + - "**.svg" + - "adr/**" + - "docs/**" + - "CODEOWNERS" + schedule: + - cron: "32 2 * * 5" + +jobs: + validate: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["go", "javascript", "typescript"] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "package-lock.json" + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + env: + CODEQL_EXTRACTOR_GO_BUILD_TRACING: on + with: + languages: ${{ matrix.language }} + config-file: ./.github/codeql.yaml + + - name: Build + run: make build-credential-helper-linux-amd + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scan-cves.yml b/.github/workflows/scan-cves.yml new file mode 100644 index 0000000..48c2d10 --- /dev/null +++ b/.github/workflows/scan-cves.yml @@ -0,0 +1,30 @@ +name: Analyze CVEs + +permissions: + contents: read + +on: + schedule: + - cron: "0 10 * * *" + pull_request: + paths: + - "**/package.json" + - "**/package-lock.json" + - "go.mod" + - "go.sum" + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Install tools + uses: defenseunicorns/zarf/.github/actions/install-tools@main + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Check for CVEs in Dependencies + run: make test-cves diff --git a/.github/workflows/scan-gen-schema.yml b/.github/workflows/scan-gen-schema.yml new file mode 100644 index 0000000..610cbec --- /dev/null +++ b/.github/workflows/scan-gen-schema.yml @@ -0,0 +1,23 @@ +name: Validate Schema Generation +on: + pull_request: + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Check that 'make gen-schema' was ran + run: make test-gen-schema + + - name: Save logs + if: always() + uses: defenseunicorns/zarf/.github/actions/save-logs@main diff --git a/.github/workflows/scan-labels.yml b/.github/workflows/scan-labels.yml new file mode 100644 index 0000000..1a50f2a --- /dev/null +++ b/.github/workflows/scan-labels.yml @@ -0,0 +1,15 @@ +name: Validate Labels +on: + pull_request: + types: [labeled, unlabeled, opened, edited, synchronize] + +permissions: + contents: read + +jobs: + enforce: + runs-on: ubuntu-latest + steps: + - uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2 + with: + BANNED_LABELS: "needs-docs,needs-tests,needs-adr,needs-git-sign-off" diff --git a/.github/workflows/scan-lint.yml b/.github/workflows/scan-lint.yml new file mode 100644 index 0000000..085c853 --- /dev/null +++ b/.github/workflows/scan-lint.yml @@ -0,0 +1,30 @@ +name: Validate Lint +on: pull_request + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "package-lock.json" + + - name: Install Node dependencies + run: npm ci + + - name: Validate formatting of all typescript code in the repository + run: make lint-ts + + - name: Run Revive Action by pulling pre-built image + uses: docker://morphy/revive-action:v2 + with: + config: revive.toml diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..fc24d9a --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,50 @@ +name: Scorecards supply-chain security +on: + # Only the default branch is supported. + branch_protection_rule: + schedule: + - cron: '30 1 * * 6' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecards analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Used to receive a badge. + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 + with: + results_file: results.sarif + results_format: sarif + repo_token: ${{ secrets.SCORECARD_READ_TOKEN }} + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + with: + sarif_file: results.sarif diff --git a/.github/workflows/test-aws-init-package.yml b/.github/workflows/test-aws-init-package.yml new file mode 100644 index 0000000..562c537 --- /dev/null +++ b/.github/workflows/test-aws-init-package.yml @@ -0,0 +1,213 @@ +name: Test AWS Init Package +on: + pull_request: + paths-ignore: + - "**.md" + - "**.jpg" + - "**.png" + - "**.gif" + - "**.svg" + - "adr/**" + - "docs/**" + - "CODEOWNERS" + + workflow_dispatch: + inputs: + cluster_name_private: + type: string + default: "zarf-init-aws-private-test" + description: Name of the eks cluster for private ECR test + cluster_name_public: + type: string + default: "zarf-init-aws-public-test" + description: Name of the eks cluster for public ECR test + instance_type: + type: string + default: t3.medium + description: EC2 instance type to use for the EKS cluster nodes + +permissions: + id-token: write + contents: read + +# Abort prior jobs in the same workflow / PR +concurrency: + group: init-aws-${{ github.ref }} + cancel-in-progress: true + +jobs: + # Build AWS init package and EKS package + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "package-lock.json" + + - name: Install Node dependencies + run: npm ci + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Build ECR Pepr module + run: make build-module + + - name: Build AWS init package + run: make aws-init-package + + - name: Build EKS package + run: make eks-package + + # Upload the contents of the build directory for later stages to use + - name: Upload build artifacts + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: build-artifacts + path: build/ + retention-days: 1 + + # Deploy and test AWS init package with private ECR registry + validate-private-ecr: + runs-on: ubuntu-latest + needs: build + env: + CLUSTER_NAME: ${{ inputs.cluster_name_private || 'zarf-init-aws-private-test' }} + PULUMI_CONFIG_PASSPHRASE: "" + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Download build artifacts + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + with: + name: build-artifacts + path: build/ + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497 # v4.0.0 + with: + role-to-assume: ${{ secrets.AWS_NIGHTLY_ROLE }} + aws-region: us-east-1 + role-duration-seconds: 14400 + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Install Pulumi + run: curl -fsSL https://get.pulumi.com | sh + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "**/package-lock.json" + + - name: Install Node deps for every package.json in the repo + run: make install-node-deps + + - name: Deploy EKS package + run: make deploy-eks-package CLUSTER_NAME="$CLUSTER_NAME" INSTANCE_TYPE=${{ inputs.instance_type }} + + - name: Create IAM roles + run: make create-iam CLUSTER_NAME="$CLUSTER_NAME" + + - name: Update Zarf config file with registry type and IAM role ARNs + run: make update-zarf-config REGISTRY_TYPE="private" + + - name: Zarf init with private ECR registry + run: make deploy-init-package-private + + - name: Teardown the cluster + if: always() + run: make remove-eks-package + + - name: Delete private ECR repositories + if: always() + run: make delete-private-repos + + - name: Delete IAM roles + if: always() + run: make delete-iam + + - name: Save logs + if: always() + uses: defenseunicorns/zarf/.github/actions/save-logs@main + + # Deploy and test AWS init package with public ECR registry + validate-public-ecr: + runs-on: ubuntu-latest + needs: build + env: + CLUSTER_NAME: ${{ inputs.cluster_name_public || 'zarf-init-aws-public-test' }} + PULUMI_CONFIG_PASSPHRASE: "" + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Download build artifacts + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + with: + name: build-artifacts + path: build/ + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497 # v4.0.0 + with: + role-to-assume: ${{ secrets.AWS_NIGHTLY_ROLE }} + aws-region: us-east-1 + role-duration-seconds: 14400 + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Install Pulumi + run: curl -fsSL https://get.pulumi.com | sh + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "**/package-lock.json" + + - name: Install Node deps for every package.json in the repo + run: make install-node-deps + + - name: Deploy EKS package + run: make deploy-eks-package CLUSTER_NAME="$CLUSTER_NAME" INSTANCE_TYPE=${{ inputs.instance_type }} + + - name: Create IAM roles + run: make create-iam CLUSTER_NAME="$CLUSTER_NAME" + + - name: Update Zarf config file with registry type and IAM role ARNs + run: make update-zarf-config REGISTRY_TYPE="public" + + - name: Zarf init with public ECR registry + run: make deploy-init-package-public + + - name: Teardown the cluster + if: always() + run: make remove-eks-package + + - name: Delete public ECR repositories + if: always() + run: make delete-public-repos + + - name: Delete IAM roles + if: always() + run: make delete-iam + + - name: Save logs + if: always() + uses: defenseunicorns/zarf/.github/actions/save-logs@main diff --git a/.github/workflows/test-pepr-module.yml b/.github/workflows/test-pepr-module.yml new file mode 100644 index 0000000..1939366 --- /dev/null +++ b/.github/workflows/test-pepr-module.yml @@ -0,0 +1,40 @@ +name: Test Pepr Module +on: + pull_request: + paths-ignore: + - "**.md" + - "**.jpg" + - "**.png" + - "**.gif" + - "**.svg" + - "adr/**" + - "docs/**" + - "CODEOWNERS" + +permissions: + contents: read + +# Abort prior jobs in the same workflow / PR +concurrency: + group: pepr-module-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: "package-lock.json" + + - name: Install Node dependencies + run: npm ci + + - name: Run unit tests for Pepr module + run: make test-module diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5c9c04e --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules +dist +insecure* +coverage +build +Pulumi.**.y*ml +binaries +eks.yaml +**.tar.zst +zarf-config.y*ml +zarf-sbom diff --git a/.grype.yaml b/.grype.yaml new file mode 100644 index 0000000..a9f6d5d --- /dev/null +++ b/.grype.yaml @@ -0,0 +1,4 @@ +ignore: + # From Pulumi's tests - This is only used for development + - vulnerability: GHSA-m425-mq94-257g + - vulnerability: GHSA-qppj-fm5r-hxr3 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7c4c513 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "arrowParens": "avoid", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "insertPragma": false, + "printWidth": 80, + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..ed46dd8 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,5 @@ +* @Racer159 @Noxsios @jeff-mccoy @lucasrod16 + +# Additional privileged files +/CODEOWNERS @jeff-mccoy @mikevanhemert @austenbryan +/LICENSE @jeff-mccoy @austenbryan diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4a409b7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing to the Zarf Init Package for AWS + +This repo follows the same general contributing guidelines and practices as Zarf. Please refer to [Zarf's contributing guide](https://github.com/defenseunicorns/zarf/blob/main/CONTRIBUTING.md) for more information. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8e600fc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM cgr.dev/chainguard/static:latest + +# 65532 is the UID of the `nonroot` user in chainguard/static. See: https://edu.chainguard.dev/chainguard/chainguard-images/reference/static/overview/#users +USER 65532:65532 + +COPY --chown=65532:65532 build/zarf-ecr-credential-helper /zarf-ecr-credential-helper + +CMD [ "/zarf-ecr-credential-helper" ] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..20e7f68 --- /dev/null +++ b/Makefile @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: 2021-Present The Zarf Authors + +# Provide a default value for the operating system architecture used in tests, e.g. " APPLIANCE_MODE=true|false make test-e2e ARCH=arm64" +ARCH ?= amd64 +ZARF_VERSION ?= $$(zarf version) +CREDENTIAL_HELPER_BIN := ./build/zarf-ecr-credential-helper +CLUSTER_NAME ?= "" +INSTANCE_TYPE ?= t3.small +EKS_PACKAGE := ./build/zarf-package-distro-eks-multi-0.0.5.tar.zst +REGISTRY_TYPE ?= "" +###################################################################################### + +.DEFAULT_GOAL := help + +.PHONY: help +help: ## Display this help information + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ + | sort | awk 'BEGIN {FS = ":.*?## "}; \ + {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +clean: ## Clean the build directory + rm -rf build + +destroy: ## Run `zarf destroy` on the current cluster + zarf destroy --confirm --remove-components + +delete-packages: ## Delete all Zarf package tarballs in the project recursively + find . -type f -name 'zarf-package-*' -delete + +lint-ts: ## Validate formatting of all typescript code in the repository + npx pepr format --validate-only + +# Note: This will automatically make changes to .ts files +format-ts: ## Format all typescript code in the repository + npx pepr format + +build-module: ## Build the ECR Pepr module + npm run build + cp ./dist/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml ./manifests/ + +test-module: ## Test the ECR Pepr module + npm run unit-test + +install-node-deps: # Run "npm ci" in each directory containing a "package.json" file + npm ci; + cd iam && npm ci; + cd hack/update-zarf-config && npm ci; + +gen-schema: ## Generate TypeScript interfaces from Zarf structs + hack/gen-schema/gen-schema.sh + +# INTERNAL: used to test that a dev has ran `make gen-schema` in their PR +test-gen-schema: + $(MAKE) gen-schema + hack/gen-schema/check-gen-schema.sh + +# Note: the path to the main.go file is not used due to https://github.com/golang/go/issues/51831#issuecomment-1074188363 +build-credential-helper-linux-amd: ## Build the ECR credential helper binary for Linux on AMD64 + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./build/zarf-ecr-credential-helper + +build-local-credential-helper-image: ## Build the ECR credential helper image to be used in a locally built init package + @test -s $(CREDENTIAL_HELPER_BIN) || $(MAKE) build-credential-helper-linux-amd + docker buildx build --load --platform linux/$(ARCH) --tag ghcr.io/defenseunicorns/zarf-init-aws/ecr-credential-helper:local . + +aws-init-package: ## Build the AWS Zarf init package + ZARF_CONFIG="zarf-config.example.yaml" zarf package create -o build -a $(ARCH) --confirm . + +# INTERNAL: used to build a release version of the AWS init package with a specific credential-helper image +release-aws-init-package: + ZARF_CONFIG="zarf-config.example.yaml" zarf package create -o build -a $(ARCH) --set CREDENTIAL_HELPER_IMAGE_TAG=$(CREDENTIAL_HELPER_IMAGE_TAG) --confirm . + +# INTERNAL: used to publish the AWS init package +publish-aws-init-package: + zarf package publish build/zarf-init-$(ARCH)-$(ZARF_VERSION).tar.zst oci://$(REPOSITORY_URL) + zarf package publish . oci://$(REPOSITORY_URL) + +eks-package: ## Build the EKS package + zarf package create packages/eks -a multi -o build --confirm + +deploy-eks-package: ## Deploy the EKS package to create an EKS cluster + @if [ -z "$(CLUSTER_NAME)" ]; then \ + echo "Error: CLUSTER_NAME is not provided. Please set CLUSTER_NAME with a valid cluster name."; \ + echo "Example: make deploy-eks-package CLUSTER_NAME=my-cluster-name"; \ + exit 1; \ + fi + + @test -s $(EKS_PACKAGE) || { $(MAKE) eks-package; } + + zarf package deploy $(EKS_PACKAGE) \ + --components="deploy-eks-cluster" \ + --set=EKS_CLUSTER_NAME="$(CLUSTER_NAME)" \ + --set=EKS_INSTANCE_TYPE="$(INSTANCE_TYPE)" \ + --confirm + +remove-eks-package: ## Remove the EKS package to teardown an EKS cluster + zarf package remove $(EKS_PACKAGE) --confirm + +create-iam: ## Create AWS IAM policies and roles used in CI + @if [ -z "$(CLUSTER_NAME)" ]; then \ + echo "Error: CLUSTER_NAME is not provided. Please set CLUSTER_NAME with an existing EKS cluster name."; \ + echo "Example: make create-iam CLUSTER_NAME=my-cluster-name"; \ + exit 1; \ + fi + + @cd iam || exit \ + && pulumi logout \ + && pulumi login --local \ + && test $$(pulumi stack --show-name --non-interactive) || PULUMI_CONFIG_PASSPHRASE="" pulumi stack init ci \ + && PULUMI_CONFIG_PASSPHRASE="" CLUSTER_NAME="$(CLUSTER_NAME)" pulumi up --yes + +delete-iam: ## Delete AWS IAM policies and roles used in CI + @cd iam || exit \ + && PULUMI_CONFIG_PASSPHRASE="" pulumi down --yes \ + && PULUMI_CONFIG_PASSPHRASE="" pulumi stack rm ci --yes + +update-zarf-config: ## Generate a new Zarf config file with registry type and IAM role ARN values to use for 'zarf init' + @cd iam || exit \ + && node ../hack/update-zarf-config/index.mjs "$(REGISTRY_TYPE)" "$$(PULUMI_CONFIG_PASSPHRASE="" pulumi stack output webhookRoleArn)" "$$(PULUMI_CONFIG_PASSPHRASE="" pulumi stack output credentialHelperRoleArn)" + +deploy-init-package-private: ## Run zarf init to deploy the AWS init package configured with private ECR registry + @cd build || exit \ + && ZARF_CONFIG="../zarf-config.yaml" zarf init \ + --registry-url="$$(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.us-east-1.amazonaws.com" \ + --registry-push-username="AWS" \ + --registry-push-password="$$(aws ecr get-login-password --region us-east-1)" \ + --components="zarf-ecr-credential-helper" \ + --confirm + +delete-private-repos: ## Delete private ECR repos created by deploying the AWS init package + @repos="defenseunicorns/pepr/controller defenseunicorns/zarf/agent defenseunicorns/zarf-init-aws/ecr-credential-helper"; \ + for repo in $${repos}; do \ + aws ecr delete-repository --repository-name "$$repo" --force || true; \ + done + +deploy-init-package-public: ## Run zarf init to deploy the AWS init package configured with public ECR registry + @cd build || exit \ + && ZARF_CONFIG="../zarf-config.yaml" zarf init \ + --registry-url="$$(aws ecr-public describe-registries --query 'registries[0].registryUri' --output text --region us-east-1)" \ + --registry-push-username="AWS" \ + --registry-push-password="$$(aws ecr-public get-login-password --region us-east-1)" \ + --components="zarf-ecr-credential-helper" \ + --confirm + +delete-public-repos: ## Delete public ECR repos created by deploying the AWS init package + @repos="defenseunicorns/pepr/controller defenseunicorns/zarf/agent defenseunicorns/zarf-init-aws/ecr-credential-helper"; \ + for repo in $${repos}; do \ + aws ecr-public delete-repository --repository-name "$$repo" --force || true; \ + done + +# INTERNAL: used to test for new CVEs that may have been introduced +test-cves: + zarf tools sbom packages --exclude './binaries' . -o json | grype --fail-on low + +# INTERNAL: used to ensure the build directory exists +ensure-build-dir: + mkdir -p build + +cve-report: ensure-build-dir ## Create a CVE report for the current project (must `brew install grype` first) + zarf tools sbom packages --exclude './binaries' . -o json | grype -o template -t hack/.templates/grype.tmpl > build/zarf-known-cves.csv diff --git a/README.md b/README.md index 11f6ef6..d319d87 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,125 @@ -# zarf-init-aws -Zarf Init Package for AWS - DevSecOps for Air Gap & Limited-Connection Systems. https://zarf.dev/ +# Zarf Init Package for AWS + +[![Latest Release](https://img.shields.io/github/v/release/defenseunicorns/zarf-init-aws)](https://github.com/defenseunicorns/zarf-init-aws/releases) +[![Build Status](https://img.shields.io/github/actions/workflow/status/defenseunicorns/zarf-init-aws/release.yml)](https://github.com/defenseunicorns/zarf-init-aws/actions/workflows/release.yml) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/defenseunicorns/zarf-init-aws/badge)](https://api.securityscorecards.dev/projects/github.com/defenseunicorns/zarf-init-aws) + +Zarf eliminates the [complexity of air gap software delivery](https://www.itopstimes.com/contain/air-gap-kubernetes-considerations-for-running-cloud-native-applications-without-the-cloud/) for Kubernetes clusters and cloud-native workloads using a declarative packaging strategy to support DevSecOps in offline and semi-connected environments. + +## 👀 Looking for Zarf? + +- [Zarf Website](https://zarf.dev) +- [Zarf Overview](https://docs.zarf.dev/docs/zarf-overview) +- [Zarf Repo](https://github.com/defenseunicorns/Zarf) + +## Zarf Init Package for AWS + +This repository contains the Zarf init package for AWS that uses [ECR](https://aws.amazon.com/ecr/) as an OCI registry and deploys onto [EKS](https://aws.amazon.com/eks/). + +## Usage + +### Prerequisites + +- Zarf CLI (version >= `v0.30.0`) + - + +- Connection to an existing EKS cluster configured with an IAM OIDC identity provider to allow [IRSA](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) authentication + - + +- AWS CLI configured with the necessary permissions to describe and create ECR repositories, and fetch ECR tokens + +- Create IAM role for the Pepr webhook to be able to list and create ECR repositories + - See an [example role for reference](iam/json/ecr-webhook-role.json). Be sure to replace the `{{AWS_ACCOUNT_ID}}` and `{{EKS_CLUSTER_ID}}` placeholders, as well as the AWS region with your values. + + - You will need to create an IAM policy with the appropriate permissions and attach it to the role. See an [example policy for reference](iam/json/ecr-webhook-policy.json). + + ***Note***: If you only need to work with a private ECR registry, the `ecr-public:` prefixed actions can be removed from the policy. Likewise, if you only need to work with a public ECR registry, the `ecr:` prefixed actions can be removed from the policy. + +- (Optional) Create IAM role for the `zarf-ecr-credential-helper` to be able to fetch new ECR auth tokens + - The credential helper is an optional component and is NOT required to use ECR as an external Zarf registry. It can be used if you are looking for an automated solution for keeping your image pull secrets updated with valid ECR auth tokens. Frequent rotation of ECR tokens in image pull secrets is required because they expire after 12 hours. + + - See an [example role for reference](iam/json/ecr-credential-helper-role.json). Be sure to replace the `{{AWS_ACCOUNT_ID}}` and `{{EKS_CLUSTER_ID}}` placeholders, as well as the AWS region with your values. + + - You will need to create an IAM policy with the appropriate permissions and attach it to the role. See an [example policy for reference](iam/json/ecr-credential-helper-policy.json). + + ***Note***: If you only need to work with a private ECR registry, the `ecr-public:` prefixed actions can be removed from the policy. Likewise, if you only need to work with a public ECR registry, the `ecr:` prefixed actions can be removed from the policy. + +### Get the Zarf init package + +```bash +zarf package pull oci://ghcr.io/defenseunicorns/packages/init-aws:$(zarf version)-amd64 +``` + +### Initialize EKS cluster with Zarf configured to use ECR as external registry + +#### Use ***private*** ECR registry + +1. Create a Zarf config file `zarf-config.yaml` + + ```yaml + architecture: amd64 + + package: + deploy: + components: zarf-ecr-credential-helper + set: + registry_type: private + + # Change me to your AWS region if needed + aws_region: us-east-1 + + # Set IAM role ARNs + ecr_hook_role_arn: + ecr_credential_helper_role_arn: + + ``` + +1. Zarf init + + Note: Be sure to run the `zarf init` command from the same working directory as your Zarf config file or set the `ZARF_CONFIG` environment variable to point to your config file. + + ```bash + AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text) + + # Note: Be sure the region you specify in the --registry-url matches the one specified in your Zarf config file + zarf init \ + --registry-url="${AWS_ACCOUNT_ID}.dkr.ecr..amazonaws.com" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr get-login-password --region )" \ + --confirm + ``` + +#### Use ***public*** ECR registry + +1. Create a Zarf config file `zarf-config.yaml` + + ```yaml + architecture: amd64 + + package: + deploy: + components: zarf-ecr-credential-helper + set: + registry_type: public + + # Must use us-east-1 region for public ECR registries + # https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html#public-registry-auth + aws_region: us-east-1 + + # Set IAM role ARNs + ecr_hook_role_arn: + ecr_credential_helper_role_arn: + + ``` + +1. Zarf init + + Note: Be sure to run the `zarf init` command from the same working directory as your Zarf config file or set the `ZARF_CONFIG` environment variable to point to your config file. + + ```bash + zarf init \ + --registry-url="$(aws ecr-public describe-registries --query 'registries[0].registryUri' --output text --region us-east-1)" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr-public get-login-password --region us-east-1)" \ + --confirm + ``` diff --git a/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md b/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md new file mode 100644 index 0000000..58cb313 --- /dev/null +++ b/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md @@ -0,0 +1,109 @@ +# 1. Use Pulumi TypeScript SDK to provision AWS IAM resources + +Date: 2023-10-13 + +## Status + +Accepted + +## Context + +Currently, the Zarf Init Package for AWS has two components that require access to ECR in AWS to function correctly, the Pepr webhook and zarf-ecr-credential-helper. EKS is currently the only Kubernetes distribution that is supported and tested on. We are leveraging an authentication feature of EKS called 'IAM Roles for Service Accounts (IRSA)', which allows you to add an annotation to a Kubernetes Service Account with the Amazon Resource Name (ARN) of an IAM role that contains the necessary policies and permissions. Here is how we are currently using this Service Account annotation to give Pepr the necessary permissions to list and create ECR repositories: + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_HOOK_ROLE_ARN###" +``` + +For more information on EKS IRSA authentication, see: + +The IAM role used for Pepr to use IRSA authentication looks like: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:pepr-system:pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0" + } + } + } + ] +} +``` + +The `{{EKS_CLUSTER_ID}}` is a placeholder value for an EKS cluster's OIDC issuer ID that is unique for each EKS cluster. Because we are provisioning ephemeral EKS clusters in CI to test the Zarf Init Package for AWS, we must dynamically fetch this data from the EKS cluster after it has been created, and replace the placeholder values in the IAM role(s) with the actual value. + +Four approaches have been considered to handle the updating and provisioning of the IAM policies and roles needed for our tests: + +1. Shell script using AWS CLI +2. Pulumi Go SDK +3. Pulumi TypeScript SDK +4. Terraform + +### Shell script using AWS CLI + +Pros: + +- Simple and quick to write to get a working solution + +Cons: + +- Requires using tools like `sed` to perform string replacements, which hinders portability and readability. For example, `gsed` is needed to work on MacOS, but `sed` is needed to work on Linux. + +### Pulumi Go SDK + +Pros: + +- Strongly typed programming language +- Aligns with Defense Unicorns' tech stack +- More portable than a shell script + +Cons: + +- The Pulumi Go SDK results in very verbose programs. Requires roughly 3x the amount of code when compared to a shell script. This results in slower development, debugging, and ultimately, cycle times. + +### Pulumi TypeScript SDK + +Pros: + +- Strongly typed programming language +- Aligns with Defense Unicorns' tech stack +- More portable than a shell script +- Less verbose than the Pulumi Go SDK + +Cons: + +- Typescript is a less common language in DevOps vs Go +- By default, TS requires a NodeJS runtime to execute (less portable than a statically linked binary) + +### Terraform + +Pros: + +- Has been the de-facto standard for Infrastructure as Code for years +- Many engineers at Defense Unicorns are familiar with it + +Cons: + +- It is not released under an Open Source license (BSL): + +## Decision + +The Zarf Init Package for AWS will use the Pulumi TypeScript SDK to handle the updating and provisioning of IAM resources for use in our tests. This allows us to leverage a robust programming language that is clean and concise to read and write, and also allows for easier local testing due to the improved portability. + +## Consequences + +There may be a more steep learning curve for contributors who are unfamiliar with Pulumi or TypeScript. diff --git a/adr/template.md b/adr/template.md new file mode 100644 index 0000000..596fb25 --- /dev/null +++ b/adr/template.md @@ -0,0 +1,19 @@ +# NUMBER. TITLE + +Date: DATE + +## Status + +STATUS + +## Context + +The issue motivating this decision, and any context that influences or constrains the decision. + +## Decision + +The change that we're proposing or have agreed to implement. + +## Consequences + +What becomes easier or more difficult to do and any risks introduced by the change that will need to be mitigated. diff --git a/capabilities/ecr-private.ts b/capabilities/ecr-private.ts new file mode 100644 index 0000000..7d94e1e --- /dev/null +++ b/capabilities/ecr-private.ts @@ -0,0 +1,104 @@ +import { + ECR, + CreateRepositoryCommand, + CreateRepositoryCommandInput, + DescribeRepositoriesCommand, + DescribeRepositoriesCommandInput, +} from "@aws-sdk/client-ecr"; +import { Log } from "pepr"; +import { ECRProvider } from "./ecr-provider"; + +/** + * Regular expression pattern to match private ECR URLs and extract the AWS account ID. + * + * See the Repository registryId pattern for more info: + * https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_Repository.html + * + * For a more detailed explanation: https://regex101.com/r/crzaI2/1 + * @type {RegExp} + */ +export const privateECRURLPattern: RegExp = + /^(?[0-9]{12})\.dkr\.ecr\..*\.amazonaws\.com$/; + +/** + * Provides methods to interact with private ECR repositories. + */ +export class ECRPrivate implements ECRProvider { + private ecr: ECR; + + /** + * Creates an instance of ECRPrivate. + * @param {string} region - The AWS region in which the ECR repositories are created. + */ + constructor(region: string) { + this.ecr = new ECR({ region }); + } + + /** + * Checks if the provided repository names already exist in the ECR registry and returns them as an array. + * @param {string[]} repoNames - An array of repository names to check for existence. + * @returns {Promise} An array of repository names that already exist in the ECR registry. + */ + async listExistingRepositories(repoNames: string[]): Promise { + try { + const existingRepositories: string[] = []; + + for (const repoName of repoNames) { + const params: DescribeRepositoriesCommandInput = { + repositoryNames: [repoName], + }; + + try { + await this.ecr.send(new DescribeRepositoriesCommand(params)); + Log.info(`Repository '${repoName}' already exists`); + existingRepositories.push(repoName); + } catch (err) { + if (err.name === "RepositoryNotFoundException") { + // Ignore this error and proceed to the next iteration + continue; + } else { + throw err; + } + } + } + return existingRepositories; + } catch (err) { + Log.error(`Error checking for existing ECR repositories: ${err}`); + return []; + } + } + + /** + * Creates ECR repositories for the specified repository names if they do not already exist. + * @param {string[]} repoNames - An array of repository names to create. + * @param {string} [accountId] - The AWS account ID where the repositories will be created. + * @returns {Promise} + */ + async createRepositories( + repoNames: string[], + accountId?: string, + ): Promise { + try { + const existingRepos = await this.listExistingRepositories(repoNames); + + for (const repoName of repoNames) { + if (!existingRepos?.includes(repoName)) { + const createParams: CreateRepositoryCommandInput = { + repositoryName: repoName, + registryId: accountId, + imageTagMutability: "IMMUTABLE", + imageScanningConfiguration: { + scanOnPush: true, + }, + }; + + await this.ecr.send(new CreateRepositoryCommand(createParams)); + + Log.info(`ECR Repository '${repoName}' created successfully.`); + } + } + } catch (err) { + Log.error(`Error creating ECR repositories: ${err}`); + } + } +} diff --git a/capabilities/ecr-provider.ts b/capabilities/ecr-provider.ts new file mode 100644 index 0000000..8e0548b --- /dev/null +++ b/capabilities/ecr-provider.ts @@ -0,0 +1,7 @@ +/** + * Represents an interface for interacting with ECR registries. + */ +export interface ECRProvider { + listExistingRepositories(repoNames: string[]): Promise; + createRepositories(repoNames: string[], accountId?: string): Promise; +} diff --git a/capabilities/ecr-public.ts b/capabilities/ecr-public.ts new file mode 100644 index 0000000..e5d771a --- /dev/null +++ b/capabilities/ecr-public.ts @@ -0,0 +1,95 @@ +import { + ECRPUBLICClient, + CreateRepositoryCommand, + CreateRepositoryCommandInput, + DescribeRepositoriesCommand, + DescribeRepositoriesCommandInput, +} from "@aws-sdk/client-ecr-public"; +import { Log } from "pepr"; +import { ECRProvider } from "./ecr-provider"; + +/** + * Regular expression pattern to match public ECR URLs. + * + * See the RegistryAlias name pattern for more info: + * https://docs.aws.amazon.com/AmazonECRPublic/latest/APIReference/API_RegistryAlias.html + * + * For a more detailed explanation: https://regex101.com/r/1WsT03/1 + * @type {RegExp} + */ +export const publicECRURLPattern: RegExp = + /^public\.ecr\.aws\/[a-z][a-z0-9]+(?:[._-][a-z0-9]+)*$/; + +/** + * Provides methods to interact with public ECR repositories. + */ +export class ECRPublic implements ECRProvider { + private ecr: ECRPUBLICClient; + + /** + * Creates an instance of ECRPublic. + * @param {string} region - The AWS region in which the public ECR repositories are created. + */ + constructor(region: string) { + this.ecr = new ECRPUBLICClient({ region }); + } + + /** + * Checks if the provided repository names already exist in the ECR registry and returns them as an array. + * @param {string[]} repoNames - An array of repository names to check for existence. + * @returns {Promise} An array of repository names that already exist in the ECR registry. + */ + async listExistingRepositories(repoNames: string[]): Promise { + try { + const existingRepositories: string[] = []; + + for (const repoName of repoNames) { + const params: DescribeRepositoriesCommandInput = { + repositoryNames: [repoName], + }; + + try { + await this.ecr.send(new DescribeRepositoriesCommand(params)); + Log.info(`Repository '${repoName}' already exists`); + existingRepositories.push(repoName); + } catch (err) { + if (err.name === "RepositoryNotFoundException") { + // Ignore this error and proceed to the next iteration + continue; + } else { + throw err; + } + } + } + return existingRepositories; + } catch (err) { + Log.error(`Error checking for existing public ECR repositories: ${err}`); + return []; + } + } + + /** + * Creates public ECR repositories for the specified repository names if they do not already exist. + * @param {string[]} repoNames - An array of repository names to create. + * @returns {Promise} + */ + async createRepositories(repoNames: string[]): Promise { + try { + const existingRepos = await this.listExistingRepositories(repoNames); + + for (const repoName of repoNames) { + if (!existingRepos?.includes(repoName)) { + const createParams: CreateRepositoryCommandInput = { + repositoryName: repoName, + }; + + await this.ecr.send(new CreateRepositoryCommand(createParams)); + + Log.info(`ECR Repository '${repoName}' created successfully.`); + } + } + } catch (err) { + Log.error(`Error creating public ECR repositories: ${err}`); + } + } +} diff --git a/capabilities/lib/ecr.ts b/capabilities/lib/ecr.ts new file mode 100644 index 0000000..219804b --- /dev/null +++ b/capabilities/lib/ecr.ts @@ -0,0 +1,115 @@ +import { K8s, kind, Log } from "pepr"; +import { getRepositoryNames } from "./utils"; +import { ZarfState, DeployedComponent, ZarfComponent } from "../zarf-types"; +import { privateECRURLPattern, ECRPrivate } from "../ecr-private"; +import { publicECRURLPattern, ECRPublic } from "../ecr-public"; + +/** + * Represents the result of checking whether the Zarf registry is an ECR registry. + */ +interface ECRCheckResult { + isECR: boolean; // Indicates if the registry is an ECR registry. + registryURL: string; // The URL of the ECR registry. +} + +/** + * Check whether the configured Zarf registry is an ECR registry. + * @returns {Promise} The result of the ECR registry check. + * @throws {Error} If an error occurs while fetching or parsing the Zarf state secret. + */ +export async function isECRregistry(): Promise { + let zarfState: ZarfState; + + // Fetch the Zarf state secret + try { + const secret = await K8s(kind.Secret).InNamespace("zarf").Get("zarf-state"); + const secretString = atob(secret.data.state); + zarfState = JSON.parse(secretString); + } catch (err) { + throw new Error( + `Error: Failed to get secret 'zarf-state' in namespace 'zarf': ${err}`, + ); + } + + const registryURL = zarfState.registryInfo.address; + + if (zarfState.registryInfo.internalRegistry === true) { + Log.warn( + "Zarf is configured to use an internal registry. Skipping creating ECR repos.", + ); + return { isECR: false, registryURL }; + } + + if ( + publicECRURLPattern.test(registryURL) || + privateECRURLPattern.test(registryURL) + ) { + return { isECR: true, registryURL }; + } + + return { isECR: false, registryURL }; +} + +/** + * Creates ECR repositories for a component in the specified registry. + * + * @param {DeployedComponent} deployedComponent - The deployed Zarf component. + * @param {ZarfComponent} zarfComponent - The corresponding Zarf component. + * @param {string} registryURL - The URL of the ECR registry where repositories should be created. + * @returns {Promise} + */ +export async function createRepos( + deployedComponent: DeployedComponent, + zarfComponent: ZarfComponent, + registryURL: string, +): Promise { + Log.info( + `Gathering a list of ECR repository names to create for component '${deployedComponent.name}'`, + ); + + const repoNames = getRepositoryNames(zarfComponent.images); + + if (!repoNames) { + Log.info( + `No repositories will be created for component '${deployedComponent.name}`, + ); + return; + } + + const region = process.env.AWS_REGION; + + // Create repositories for private ECR registry + if (privateECRURLPattern.test(registryURL)) { + const accountId = getAccountId(registryURL); + const ecrPrivate = new ECRPrivate(region); + + Log.info("Attempting to create ECR repositories"); + await ecrPrivate.createRepositories(repoNames, accountId); + } + + // Create repositories for public ECR registry + if (publicECRURLPattern.test(registryURL)) { + const ecrPublic = new ECRPublic(region); + + Log.info("Attempting to create ECR repositories"); + await ecrPublic.createRepositories(repoNames); + } +} + +/** + * Get the AWS account ID from a private ECR URL. + * @param {string} url - The private ECR URL. + * @returns {string} The AWS account ID extracted from the URL. + * @throws {Error} If the URL format is invalid. + */ +export function getAccountId(url: string): string { + const matches = url.match(privateECRURLPattern); + + if (!matches || matches.length !== 2) { + throw new Error(`Invalid private ECR URL format: ${url}`); + } + + const [, accountId] = matches; + + return accountId; +} diff --git a/capabilities/lib/utils.test.ts b/capabilities/lib/utils.test.ts new file mode 100644 index 0000000..de48a1a --- /dev/null +++ b/capabilities/lib/utils.test.ts @@ -0,0 +1,96 @@ +import { getRepositoryNames } from "./utils"; +import { getAccountId } from "./ecr"; + +describe("getRepositoryNames", () => { + const testCases = [ + { + input: "defenseunicorns/pepr/controller:v0.13.0", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "defenseunicorns/pepr/controller:latest", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "defenseunicorns/pepr/controller", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "ghcr.io/defenseunicorns/zarf/agent:local", + expected: "defenseunicorns/zarf/agent", + }, + { + input: "ghcr.io/defenseunicorns/zarf/agent", + expected: "defenseunicorns/zarf/agent", + }, + { + input: "registry1.dso.mil/defenseunicorns/zarf/agent:latest", + expected: "defenseunicorns/zarf/agent", + }, + { + input: + "defenseunicorns/zarf-game@sha256:f78e442f0f3eb3e9459b5ae6b1a8fda62f8dfe818112e7d130a4e8ae72b3cbff", + expected: "defenseunicorns/zarf-game", + }, + { + input: + "registry.com:8080/repo/name:tag@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", + expected: "repo/name", + }, + { + input: "registry.com:8080/repo/name:tag", + expected: "repo/name", + }, + { + input: + "localhost:8080/repo/name@sha256:be178c0543eb17f5f3043021c9e5fcf30285e557a4fc309cce97ff9ca6182912", + expected: "repo/name", + }, + ]; + + testCases.forEach(({ input, expected }) => { + it(`correctly extracts repository name from ${input}`, () => { + const result = getRepositoryNames([input]); + expect(result).toEqual([expected]); + }); + }); + + it("throws an error when the images input array is null", () => { + const testFunction = () => getRepositoryNames([]); + + expect(testFunction).toThrow( + "Error: expected at least 1 image reference, but got none", + ); + }); +}); + +describe("getAccountId", () => { + const testCases = [ + { + input: "123456789012.dkr.ecr.us-east-1.amazonaws.com", + expected: "123456789012", + }, + { + input: "210987654321.dkr.ecr.us-west-2.amazonaws.com", + expected: "210987654321", + }, + ]; + + testCases.forEach(({ input, expected }) => { + it(`correctly extracts AWS account ID from ${input}`, () => { + const result = getAccountId(input); + expect(result).toEqual(expected); + }); + }); + + it("throws an error when an invalid ECR URL is provided", () => { + // Only has 11 digit account ID. Valid account IDs have 12 digits + const invalidInput = "12345678901.dkr.ecr.us-east-1.amazonaws.com"; + + const testFunction = () => getAccountId(invalidInput); + + expect(testFunction).toThrow( + "Invalid private ECR URL format: 12345678901.dkr.ecr.us-east-1.amazonaws.com", + ); + }); +}); diff --git a/capabilities/lib/utils.ts b/capabilities/lib/utils.ts new file mode 100644 index 0000000..a2e0911 --- /dev/null +++ b/capabilities/lib/utils.ts @@ -0,0 +1,252 @@ +import { K8s, kind, Log, a } from "pepr"; +import { createRepos } from "./ecr"; +import { + ZarfComponent, + DeployedComponent, + DeployedPackage, +} from "../zarf-types"; + +/** + * Represents a component check result, indicating whether a component is ready for a webhook to execute. + */ +interface componentCheck { + component: ZarfComponent; + deployedComponent: DeployedComponent; + isReady: boolean; +} + +/** + * Checks if a component is ready for a webhook to execute for it. + * @param {DeployedPackage} deployedPackage - The Zarf deployed package data to check. + * @param {string} webhookName - The name of the webhook. + * @returns {componentCheck | null} A component check result or null if no components meet the criteria. + */ +export function componentReadyForWebhook( + deployedPackage: DeployedPackage, + webhookName: string, +): componentCheck | null { + // Create a map of components by name + const componentsByName = new Map(); + deployedPackage.data.components.forEach(component => { + componentsByName.set(component.name, component); + }); + + for (const deployedComponent of deployedPackage.deployedComponents) { + const component = componentsByName.get(deployedComponent.name); + + if (!component) { + continue; + } + if (!component.images) { + continue; + } + if (deployedComponent.status !== "Deploying") { + continue; + } + + const componentWebhook = + deployedPackage.componentWebhooks?.[deployedComponent.name]?.[ + webhookName + ]; + + // Check if the component has a webhook running for the current package generation + if (componentWebhook?.observedGeneration === deployedPackage.generation) { + Log.debug( + `The component '${deployedComponent.name}' has already had a webhook executed for it. Not executing another.`, + ); + continue; + } + + return { + component: component, + deployedComponent: deployedComponent, + isReady: true, + }; + } + + return null; +} + +/** + * Get repository names from a list of image references. + * + * Extracts the substring between the tag/SHA and the domain name if present. + * + * Example: + * + * Input: registry.com:8080/repo/name:tag + * + * Output: repo/name + * + * @param {string[]} images - The list of image references. + * @returns {string[]} An array of repository names extracted from the image references. + * @throws {Error} If no image references are provided. + */ +export function getRepositoryNames(images: string[]): string[] { + if (images.length === 0) { + throw new Error("Error: expected at least 1 image reference, but got none"); + } + + const repoNames = images.map((image: string) => { + let repoName = image; + + // Remove the domain name (and port) if present + const firstSlashIndex = repoName.indexOf("/"); + if (substringFound(firstSlashIndex) === true) { + // Check if the substring before the first slash '/' contains a dot '.' or a colon ':' + // indicating a domain or port number. If so, remove that part. + const substringBeforeSlash = repoName.substring(0, firstSlashIndex); + if ( + substringBeforeSlash.includes(".") || + substringBeforeSlash.includes(":") + ) { + repoName = repoName.substring(firstSlashIndex + 1); + } + } + + // Remove the hash (SHA) if present + const hashIndex = repoName.lastIndexOf("@"); + if (substringFound(hashIndex) === true) { + repoName = repoName.substring(0, hashIndex); + } + + // Remove the tag if present + const tagIndex = repoName.lastIndexOf(":"); + if (substringFound(tagIndex) === true) { + repoName = repoName.substring(0, tagIndex); + } + + return repoName; + }); + + return repoNames; +} + +/** + * Checks if a substring is found at a specified index. + * + * @param {number} index - The index to check. If the index is -1, the substring was not found. + * @returns {boolean} True if a substring was found at the specified index, false otherwise. + */ +function substringFound(index: number): boolean { + if (index === -1) { + return false; + } + return true; +} + +/** + * Creates ECR repositories and updates webhook status in a Zarf package secret. + * @param {DeployedComponent} deployedComponent - The deployed component for which repositories should be created. + * @param {string} registryURL - The URL of the ECR registry. + * @param {string} secretName - The name of the secret to update. + * @param {string} webhookName - The name of the webhook. + * @param {ZarfComponent} zarfComponent - The corresponding Zarf component. + */ +export async function createReposAndUpdateStatus( + deployedComponent: DeployedComponent, + registryURL: string, + secretName: string, + webhookName: string, + zarfComponent: ZarfComponent, +): Promise { + let webhookStatus = "Succeeded"; + + try { + await createRepos(deployedComponent, zarfComponent, registryURL); + } catch (err) { + Log.error(`Failed to create ECR repositories: ${err.message}`); + webhookStatus = "Failed"; + } finally { + await updateWebhookStatus( + secretName, + deployedComponent.name, + webhookName, + webhookStatus, + ); + } +} + +/** + * Updates the webhook status in a Zarf package secret. + * @param {string} secretName - The name of the secret to update. + * @param {string} componentName - The name of the component for which the webhook executed. + * @param {string} webhookName - The name of the webhook. + * @param {string} status - The new status for the webhook. + */ +export async function updateWebhookStatus( + secretName: string, + componentName: string, + webhookName: string, + status: string, +): Promise { + const ns = "zarf"; + + let secret: a.Secret; + let secretString: string; + let deployedPackage: DeployedPackage; + let manuallyDecoded = false; + + // Fetch the package secret + try { + secret = await K8s(kind.Secret).InNamespace(ns).Get(secretName); + } catch (err) { + Log.error( + `Error: Failed to get package secret '${secretName}' in namespace '${ns}': ${JSON.stringify( + err, + )}`, + ); + } + + try { + secretString = atob(secret.data.data); + manuallyDecoded = true; + } catch (err) { + secretString = secret.data.data; + } + + try { + deployedPackage = JSON.parse(secretString); + } catch (err) { + Log.error(`Failed to parse the secret data: ${err.message}`); + } + + const componentWebhook = + deployedPackage.componentWebhooks?.[componentName][webhookName]; + + // Update the webhook status if the observedGeneration matches + if (componentWebhook?.observedGeneration === deployedPackage.generation) { + componentWebhook.status = status; + deployedPackage.componentWebhooks[componentName][webhookName] = + componentWebhook; + } + + if (manuallyDecoded === true) { + secret.data.data = btoa(JSON.stringify(deployedPackage)); + } else { + secret.data.data = JSON.stringify(deployedPackage); + } + + // Use Server-Side force apply to forcefully take ownership of the package secret data.data field + // Doing a Server-Side apply without the force option will result in a FieldManagerConflict error due to Zarf owning the object. + try { + await K8s(kind.Secret).Apply( + { + metadata: { + name: secretName, + namespace: ns, + }, + data: { + data: secret.data.data, + }, + }, + { force: true }, + ); + } catch (err) { + throw new Error( + `Error: Failed to update package secret '${secretName}' in namespace '${ns}': ${JSON.stringify( + err, + )}`, + ); + } +} diff --git a/capabilities/webhook.ts b/capabilities/webhook.ts new file mode 100644 index 0000000..ac6d27d --- /dev/null +++ b/capabilities/webhook.ts @@ -0,0 +1,90 @@ +import { Capability, Log, a } from "pepr"; +import { isECRregistry } from "./lib/ecr"; +import { DeployedPackage } from "./zarf-types"; +import { + createReposAndUpdateStatus, + componentReadyForWebhook, +} from "./lib/utils"; + +/** + * The ECR Capability creates ECR repositories for a Zarf managed ECR registry + */ +export const ECRhook = new Capability({ + name: "ecr", + description: "Create ECR repositories for a Zarf managed ECR registry", + namespaces: ["pepr-system"], +}); + +const { When } = ECRhook; + +When(a.Secret) + .IsCreatedOrUpdated() + .InNamespace("zarf") + .WithLabel("package-deploy-info") + .Mutate(async request => { + const result = await isECRregistry(); + + if (!result.isECR) { + throw new Error( + `A valid ECR URL was not found in the Zarf state secret: ${result.registryURL}\n + Please provide a valid ECR registry URL.\n + Example: '123456789012.dkr.ecr.us-east-1.amazonaws.com'`, + ); + } + + const webhookName = "ecr-webhook"; + + const secret = request.Raw; + let deployedPackage: DeployedPackage; + let secretString: string; + let manuallyDecoded = false; + + try { + secretString = atob(secret.data.data); + manuallyDecoded = true; + } catch (err) { + secretString = secret.data.data; + } + + try { + deployedPackage = JSON.parse(secretString); + } catch (err) { + throw new Error(`Failed to parse the secret data: ${err.message}`); + } + + const componentRes = componentReadyForWebhook(deployedPackage, webhookName); + if (!componentRes) { + Log.debug( + "There are no Zarf package components ready for the ECR webhook to execute. Skipping...", + ); + return; + } + + if (!deployedPackage.componentWebhooks) { + deployedPackage.componentWebhooks = {}; + } + + // Update the webhook status noting that the webhook is running for this component. + // Zarf will pause deploying this component until the webhook status is not "Running". + deployedPackage.componentWebhooks[componentRes.deployedComponent.name] = { + "ecr-webhook": { + name: webhookName, + status: "Running", + observedGeneration: deployedPackage.generation, + }, + }; + + createReposAndUpdateStatus( + componentRes.deployedComponent, + result.registryURL, + secret.metadata.name, + webhookName, + componentRes.component, + ); + + if (manuallyDecoded === true) { + secret.data.data = btoa(JSON.stringify(deployedPackage)); + } else { + secret.data.data = JSON.stringify(deployedPackage); + } + }); diff --git a/capabilities/zarf-types.ts b/capabilities/zarf-types.ts new file mode 100644 index 0000000..cbc10ec --- /dev/null +++ b/capabilities/zarf-types.ts @@ -0,0 +1,1457 @@ +// To parse this data: +// +// import { Convert, ZarfTypes } from "./file"; +// +// const zarfTypes = Convert.toZarfTypes(json); +// +// These functions will throw an error if the JSON doesn't +// match the expected interface, even if the JSON is valid. + +export interface ZarfTypes { + DeployedPackage: DeployedPackage; + ZarfState: ZarfState; +} + +export interface DeployedPackage { + cliVersion: string; + componentWebhooks?: { [key: string]: { [key: string]: Webhook } }; + connectStrings?: { [key: string]: ConnectString }; + data: ZarfPackage; + deployedComponents: DeployedComponent[]; + generation: number; + name: string; +} + +export interface Webhook { + name: string; + observedGeneration: number; + status: string; + waitDurationSeconds?: number; +} + +export interface ConnectString { + /** + * Descriptive text that explains what the resource you would be connecting to is used for + */ + description: string; + /** + * URL path that gets appended to the k8s port-forward result + */ + url: string; +} + +export interface ZarfPackage { + /** + * Zarf-generated package build data + */ + build?: ZarfBuildData; + /** + * List of components to deploy in this package + */ + components: ZarfComponent[]; + /** + * Constant template values applied on deploy for K8s resources + */ + constants?: ZarfPackageConstant[]; + /** + * The kind of Zarf package + */ + kind: Kind; + /** + * Package metadata + */ + metadata?: ZarfMetadata; + /** + * Variable template values applied on deploy for K8s resources + */ + variables?: ZarfPackageVariable[]; +} + +/** + * Zarf-generated package build data + */ +export interface ZarfBuildData { + /** + * The architecture this package was created on + */ + architecture: string; + /** + * Whether this package was created with differential components + */ + differential?: boolean; + /** + * List of components that were not included in this package due to differential packaging + */ + differentialMissing?: string[]; + /** + * The minimum version of Zarf that does not have breaking package structure changes + */ + lastNonBreakingVersion?: string; + /** + * Any migrations that have been run on this package + */ + migrations?: string[]; + /** + * Any registry domains that were overridden on package create when pulling images + */ + registryOverrides?: { [key: string]: string }; + /** + * The machine name that created this package + */ + terminal: string; + /** + * The timestamp when this package was created + */ + timestamp: string; + /** + * The username who created this package + */ + user: string; + /** + * The version of Zarf used to build this package + */ + version: string; +} + +export interface ZarfComponent { + /** + * Custom commands to run at various stages of a package lifecycle + */ + actions?: ZarfComponentActions; + /** + * Helm charts to install during package deploy + */ + charts?: ZarfChart[]; + /** + * [Deprecated] Specify a path to a public key to validate signed online resources. This + * will be removed in Zarf v1.0.0. + */ + cosignKeyPath?: string; + /** + * Datasets to inject into a container in the target cluster + */ + dataInjections?: ZarfDataInjection[]; + /** + * Determines the default Y/N state for installing this component on package deploy + */ + default?: boolean; + /** + * Message to include during package deploy describing the purpose of this component + */ + description?: string; + /** + * Extend component functionality with additional features + */ + extensions?: ZarfComponentExtensions; + /** + * Files or folders to place on disk during package deployment + */ + files?: ZarfFile[]; + /** + * [Deprecated] Create a user selector field based on all components in the same group. This + * will be removed in Zarf v1.0.0. Consider using 'only.flavor' instead. + */ + group?: string; + /** + * List of OCI images to include in the package + */ + images?: string[]; + /** + * Import a component from another Zarf package + */ + import?: ZarfComponentImport; + /** + * Kubernetes manifests to be included in a generated Helm chart on package deploy + */ + manifests?: ZarfManifest[]; + /** + * The name of the component + */ + name: string; + /** + * Filter when this component is included in package creation or deployment + */ + only?: ZarfComponentOnlyTarget; + /** + * List of git repos to include in the package + */ + repos?: string[]; + /** + * Do not prompt user to install this component + */ + required?: boolean; + /** + * [Deprecated] (replaced by actions) Custom commands to run before or after package + * deployment. This will be removed in Zarf v1.0.0. + */ + scripts?: DeprecatedZarfComponentScripts; +} + +/** + * Custom commands to run at various stages of a package lifecycle + */ +export interface ZarfComponentActions { + /** + * Actions to run during package creation + */ + onCreate?: ZarfComponentActionSet; + /** + * Actions to run during package deployment + */ + onDeploy?: ZarfComponentActionSet; + /** + * Actions to run during package removal + */ + onRemove?: ZarfComponentActionSet; +} + +/** + * Actions to run during package creation + * + * Actions to run during package deployment + * + * Actions to run during package removal + */ +export interface ZarfComponentActionSet { + /** + * Actions to run at the end of an operation + */ + after?: ZarfComponentAction[]; + /** + * Actions to run at the start of an operation + */ + before?: ZarfComponentAction[]; + /** + * Default configuration for all actions in this set + */ + defaults?: ZarfComponentActionDefaults; + /** + * Actions to run if all operations fail + */ + onFailure?: ZarfComponentAction[]; + /** + * Actions to run if all operations succeed + */ + onSuccess?: ZarfComponentAction[]; +} + +export interface ZarfComponentAction { + /** + * The command to run. Must specify either cmd or wait for the action to do anything. + */ + cmd?: string; + /** + * Description of the action to be displayed during package execution instead of the command + */ + description?: string; + /** + * The working directory to run the command in (default is CWD) + */ + dir?: string; + /** + * Additional environment variables to set for the command + */ + env?: string[]; + /** + * Retry the command if it fails up to given number of times (default 0) + */ + maxRetries?: number; + /** + * Timeout in seconds for the command (default to 0 + */ + maxTotalSeconds?: number; + /** + * Hide the output of the command during package deployment (default false) + */ + mute?: boolean; + /** + * [Deprecated] (replaced by setVariables) (onDeploy/cmd only) The name of a variable to + * update with the output of the command. This variable will be available to all remaining + * actions and components in the package. This will be removed in Zarf v1.0.0 + */ + setVariable?: string; + /** + * (onDeploy/cmd only) An array of variables to update with the output of the command. These + * variables will be available to all remaining actions and components in the package. + */ + setVariables?: ZarfComponentActionSetVariable[]; + /** + * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on + * supported operating systems + */ + shell?: ZarfComponentActionShell; + /** + * Wait for a condition to be met before continuing. Must specify either cmd or wait for the + * action. See the 'zarf tools wait-for' command for more info. + */ + wait?: ZarfComponentActionWait; +} + +export interface ZarfComponentActionSetVariable { + /** + * Whether to automatically indent the variable's value (if multiline) when templating. + * Based on the number of chars before the start of ###ZARF_VAR_. + */ + autoIndent?: boolean; + /** + * The name to be used for the variable + */ + name: string; + /** + * An optional regex pattern that a variable value must match before a package deployment + * can continue. + */ + pattern?: string; + /** + * Whether to mark this variable as sensitive to not print it in the Zarf log + */ + sensitive?: boolean; + /** + * Changes the handling of a variable to load contents differently (i.e. from a file rather + * than as a raw variable - templated files should be kept below 1 MiB) + */ + type?: Type; +} + +/** + * Changes the handling of a variable to load contents differently (i.e. from a file rather + * than as a raw variable - templated files should be kept below 1 MiB) + */ +export enum Type { + File = "file", + Raw = "raw", +} + +/** + * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on + * supported operating systems + */ +export interface ZarfComponentActionShell { + /** + * (default 'sh') Indicates a preference for the shell to use on macOS systems + */ + darwin?: string; + /** + * (default 'sh') Indicates a preference for the shell to use on Linux systems + */ + linux?: string; + /** + * (default 'powershell') Indicates a preference for the shell to use on Windows systems + * (note that choosing 'cmd' will turn off migrations like touch -> New-Item) + */ + windows?: string; +} + +/** + * Wait for a condition to be met before continuing. Must specify either cmd or wait for the + * action. See the 'zarf tools wait-for' command for more info. + */ +export interface ZarfComponentActionWait { + /** + * Wait for a condition to be met in the cluster before continuing. Only one of cluster or + * network can be specified. + */ + cluster?: ZarfComponentActionWaitCluster; + /** + * Wait for a condition to be met on the network before continuing. Only one of cluster or + * network can be specified. + */ + network?: ZarfComponentActionWaitNetwork; +} + +/** + * Wait for a condition to be met in the cluster before continuing. Only one of cluster or + * network can be specified. + */ +export interface ZarfComponentActionWaitCluster { + /** + * The condition or jsonpath state to wait for; defaults to exist + */ + condition?: string; + /** + * The kind of resource to wait for + */ + kind: string; + /** + * The name of the resource or selector to wait for + */ + name: string; + /** + * The namespace of the resource to wait for + */ + namespace?: string; +} + +/** + * Wait for a condition to be met on the network before continuing. Only one of cluster or + * network can be specified. + */ +export interface ZarfComponentActionWaitNetwork { + /** + * The address to wait for + */ + address: string; + /** + * The HTTP status code to wait for if using http or https + */ + code?: number; + /** + * The protocol to wait for + */ + protocol: Protocol; +} + +/** + * The protocol to wait for + */ +export enum Protocol { + HTTP = "http", + HTTPS = "https", + TCP = "tcp", +} + +/** + * Default configuration for all actions in this set + */ +export interface ZarfComponentActionDefaults { + /** + * Working directory for commands (default CWD) + */ + dir?: string; + /** + * Additional environment variables for commands + */ + env?: string[]; + /** + * Retry commands given number of times if they fail (default 0) + */ + maxRetries?: number; + /** + * Default timeout in seconds for commands (default to 0 + */ + maxTotalSeconds?: number; + /** + * Hide the output of commands during execution (default false) + */ + mute?: boolean; + /** + * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on + * supported operating systems + */ + shell?: ZarfComponentActionShell; +} + +export interface ZarfChart { + /** + * The path to the chart in the repo if using a git repo instead of a helm repo + */ + gitPath?: string; + /** + * The path to the chart folder + */ + localPath?: string; + /** + * The name of the chart to deploy; this should be the name of the chart as it is installed + * in the helm repo + */ + name: string; + /** + * The namespace to deploy the chart to + */ + namespace: string; + /** + * Whether to not wait for chart resources to be ready before continuing + */ + noWait?: boolean; + /** + * The name of the release to create; defaults to the name of the chart + */ + releaseName?: string; + /** + * The URL of the OCI registry, chart repository, or git repo where the helm chart is stored + */ + url?: string; + /** + * List of local values file paths or remote URLs to include in the package; these will be + * merged together + */ + valuesFiles?: string[]; + /** + * The version of the chart to deploy; for git-based charts this is also the tag of the git + * repo + */ + version?: string; +} + +export interface ZarfDataInjection { + /** + * Compress the data before transmitting using gzip. Note: this requires support for + * tar/gzip locally and in the target image. + */ + compress?: boolean; + /** + * Either a path to a local folder/file or a remote URL of a file to inject into the given + * target pod + container + */ + source: string; + /** + * The target pod + container to inject the data into + */ + target: ZarfContainerTarget; +} + +/** + * The target pod + container to inject the data into + */ +export interface ZarfContainerTarget { + /** + * The container name to target for data injection + */ + container: string; + /** + * The namespace to target for data injection + */ + namespace: string; + /** + * The path within the container to copy the data into + */ + path: string; + /** + * The K8s selector to target for data injection + */ + selector: string; +} + +/** + * Extend component functionality with additional features + */ +export interface ZarfComponentExtensions { + /** + * Configurations for installing Big Bang and Flux in the cluster + */ + bigbang?: BigBang; +} + +/** + * Configurations for installing Big Bang and Flux in the cluster + */ +export interface BigBang { + /** + * Optional paths to Flux kustomize strategic merge patch files + */ + fluxPatchFiles?: string[]; + /** + * Override repo to pull Big Bang from instead of Repo One + */ + repo?: string; + /** + * Whether to skip deploying flux; Defaults to false + */ + skipFlux?: boolean; + /** + * The list of values files to pass to Big Bang; these will be merged together + */ + valuesFiles?: string[]; + /** + * The version of Big Bang to use + */ + version: string; +} + +export interface ZarfFile { + /** + * (files only) Determines if the file should be made executable during package deploy + */ + executable?: boolean; + /** + * Local folder or file to be extracted from a 'source' archive + */ + extractPath?: string; + /** + * (files only) Optional SHA256 checksum of the file + */ + shasum?: string; + /** + * Local folder or file path or remote URL to pull into the package + */ + source: string; + /** + * List of symlinks to create during package deploy + */ + symlinks?: string[]; + /** + * The absolute or relative path where the file or folder should be copied to during package + * deploy + */ + target: string; +} + +/** + * Import a component from another Zarf package + */ +export interface ZarfComponentImport { + /** + * The name of the component to import from the referenced zarf.yaml + */ + name?: string; + /** + * The relative path to a directory containing a zarf.yaml to import from + */ + path?: string; + /** + * [beta] The URL to a Zarf package to import via OCI + */ + url?: string; +} + +export interface ZarfManifest { + /** + * List of local K8s YAML files or remote URLs to deploy (in order) + */ + files?: string[]; + /** + * List of local kustomization paths or remote URLs to include in the package + */ + kustomizations?: string[]; + /** + * Allow traversing directory above the current directory if needed for kustomization + */ + kustomizeAllowAnyDirectory?: boolean; + /** + * A name to give this collection of manifests; this will become the name of the + * dynamically-created helm chart + */ + name: string; + /** + * The namespace to deploy the manifests to + */ + namespace?: string; + /** + * Whether to not wait for manifest resources to be ready before continuing + */ + noWait?: boolean; +} + +/** + * Filter when this component is included in package creation or deployment + */ +export interface ZarfComponentOnlyTarget { + /** + * Only deploy component to specified clusters + */ + cluster?: ZarfComponentOnlyCluster; + /** + * Only include this component when a matching '--flavor' is specified on 'zarf package + * create' + */ + flavor?: string; + /** + * Only deploy component to specified OS + */ + localOS?: LocalOS; +} + +/** + * Only deploy component to specified clusters + */ +export interface ZarfComponentOnlyCluster { + /** + * Only create and deploy to clusters of the given architecture + */ + architecture?: Architecture; + /** + * A list of kubernetes distros this package works with (Reserved for future use) + */ + distros?: string[]; +} + +/** + * Only create and deploy to clusters of the given architecture + */ +export enum Architecture { + Amd64 = "amd64", + Arm64 = "arm64", +} + +/** + * Only deploy component to specified OS + */ +export enum LocalOS { + Darwin = "darwin", + Linux = "linux", + Windows = "windows", +} + +/** + * [Deprecated] (replaced by actions) Custom commands to run before or after package + * deployment. This will be removed in Zarf v1.0.0. + */ +export interface DeprecatedZarfComponentScripts { + /** + * Scripts to run after the component successfully deploys + */ + after?: string[]; + /** + * Scripts to run before the component is deployed + */ + before?: string[]; + /** + * Scripts to run before the component is added during package create + */ + prepare?: string[]; + /** + * Retry the script if it fails + */ + retry?: boolean; + /** + * Show the output of the script during package deployment + */ + showOutput?: boolean; + /** + * Timeout in seconds for the script + */ + timeoutSeconds?: number; +} + +export interface ZarfPackageConstant { + /** + * Whether to automatically indent the variable's value (if multiline) when templating. + * Based on the number of chars before the start of ###ZARF_CONST_. + */ + autoIndent?: boolean; + /** + * A description of the constant to explain its purpose on package create or deploy + * confirmation prompts + */ + description?: string; + /** + * The name to be used for the constant + */ + name: string; + /** + * An optional regex pattern that a constant value must match before a package can be + * created. + */ + pattern?: string; + /** + * The value to set for the constant during deploy + */ + value: string; +} + +/** + * The kind of Zarf package + */ +export enum Kind { + ZarfInitConfig = "ZarfInitConfig", + ZarfPackageConfig = "ZarfPackageConfig", +} + +/** + * Package metadata + */ +export interface ZarfMetadata { + /** + * Checksum of a checksums.txt file that contains checksums all the layers within the + * package. + */ + aggregateChecksum?: string; + /** + * The target cluster architecture for this package + */ + architecture?: string; + /** + * Comma-separated list of package authors (including contact info) + */ + authors?: string; + /** + * Additional information about this package + */ + description?: string; + /** + * Link to package documentation when online + */ + documentation?: string; + /** + * An image URL to embed in this package (Reserved for future use in Zarf UI) + */ + image?: string; + /** + * Name to identify this Zarf package + */ + name: string; + /** + * Link to package source code when online + */ + source?: string; + /** + * Disable compression of this package + */ + uncompressed?: boolean; + /** + * Link to package information when online + */ + url?: string; + /** + * Name of the distributing entity, organization or individual. + */ + vendor?: string; + /** + * Generic string set by a package author to track the package version (Note: + * ZarfInitConfigs will always be versioned to the CLIVersion they were created with) + */ + version?: string; + /** + * Yaml OnLy Online (YOLO): True enables deploying a Zarf package without first running zarf + * init against the cluster. This is ideal for connected environments where you want to use + * existing VCS and container registries. + */ + yolo?: boolean; +} + +export interface ZarfPackageVariable { + /** + * Whether to automatically indent the variable's value (if multiline) when templating. + * Based on the number of chars before the start of ###ZARF_VAR_. + */ + autoIndent?: boolean; + /** + * The default value to use for the variable + */ + default?: string; + /** + * A description of the variable to be used when prompting the user a value + */ + description?: string; + /** + * The name to be used for the variable + */ + name: string; + /** + * An optional regex pattern that a variable value must match before a package can be + * deployed. + */ + pattern?: string; + /** + * Whether to prompt the user for input for this variable + */ + prompt?: boolean; + /** + * Whether to mark this variable as sensitive to not print it in the Zarf log + */ + sensitive?: boolean; + /** + * Changes the handling of a variable to load contents differently (i.e. from a file rather + * than as a raw variable - templated files should be kept below 1 MiB) + */ + type?: Type; +} + +export interface DeployedComponent { + installedCharts: InstalledChart[]; + name: string; + observedGeneration: number; + status: string; +} + +export interface InstalledChart { + chartName: string; + namespace: string; +} + +export interface ZarfState { + agentTLS: GeneratedPKI; + /** + * Machine architecture of the k8s node(s) + */ + architecture: string; + /** + * Information about the artifact registry Zarf is configured to use + */ + artifactServer: ArtifactServerInfo; + /** + * K8s distribution of the cluster Zarf was deployed to + */ + distro: string; + /** + * Information about the repository Zarf is configured to use + */ + gitServer: GitServerInfo; + /** + * Secret value that the internal Grafana server was seeded with + */ + loggingSecret: string; + /** + * Information about the container registry Zarf is configured to use + */ + registryInfo: RegistryInfo; + storageClass: string; + /** + * Indicates if Zarf was initialized while deploying its own k8s cluster + */ + zarfAppliance: boolean; +} + +export interface GeneratedPKI { + ca: string; + cert: string; + key: string; +} + +/** + * Information about the artifact registry Zarf is configured to use + */ +export interface ArtifactServerInfo { + /** + * URL address of the artifact registry + */ + address: string; + /** + * Indicates if we are using a artifact registry that Zarf is directly managing + */ + internalServer: boolean; + /** + * Password of a user with push access to the artifact registry + */ + pushPassword: string; + /** + * Username of a user with push access to the artifact registry + */ + pushUsername: string; +} + +/** + * Information about the repository Zarf is configured to use + */ +export interface GitServerInfo { + /** + * URL address of the git server + */ + address: string; + /** + * Indicates if we are using a git server that Zarf is directly managing + */ + internalServer: boolean; + /** + * Password of a user with pull-only access to the git repository. If not provided for an + * external repository then the push-user is used + */ + pullPassword: string; + /** + * Username of a user with pull-only access to the git repository. If not provided for an + * external repository then the push-user is used + */ + pullUsername: string; + /** + * Password of a user with push access to the git repository + */ + pushPassword: string; + /** + * Username of a user with push access to the git repository + */ + pushUsername: string; +} + +/** + * Information about the container registry Zarf is configured to use + */ +export interface RegistryInfo { + /** + * URL address of the registry + */ + address: string; + /** + * Indicates if we are using a registry that Zarf is directly managing + */ + internalRegistry: boolean; + /** + * Nodeport of the registry. Only needed if the registry is running inside the kubernetes + * cluster + */ + nodePort: number; + /** + * Password of a user with pull-only access to the registry. If not provided for an external + * registry than the push-user is used + */ + pullPassword: string; + /** + * Username of a user with pull-only access to the registry. If not provided for an external + * registry than the push-user is used + */ + pullUsername: string; + /** + * Password of a user with push access to the registry + */ + pushPassword: string; + /** + * Username of a user with push access to the registry + */ + pushUsername: string; + /** + * Secret value that the registry was seeded with + */ + secret: string; +} + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toZarfTypes(json: string): ZarfTypes { + return cast(JSON.parse(json), r("ZarfTypes")); + } + + public static zarfTypesToJson(value: ZarfTypes): string { + return JSON.stringify(uncast(value, r("ZarfTypes")), null, 2); + } +} + +function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { + const prettyTyp = prettyTypeName(typ); + const parentText = parent ? ` on ${parent}` : ''; + const keyText = key ? ` for key "${key}"` : ''; + throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); +} + +function prettyTypeName(typ: any): string { + if (Array.isArray(typ)) { + if (typ.length === 2 && typ[0] === undefined) { + return `an optional ${prettyTypeName(typ[1])}`; + } else { + return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`; + } + } else if (typeof typ === "object" && typ.literal !== undefined) { + return typ.literal; + } else { + return typeof typ; + } +} + +function jsonToJSProps(typ: any): any { + if (typ.jsonToJS === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ }); + typ.jsonToJS = map; + } + return typ.jsonToJS; +} + +function jsToJSONProps(typ: any): any { + if (typ.jsToJSON === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ }); + typ.jsToJSON = map; + } + return typ.jsToJSON; +} + +function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { + function transformPrimitive(typ: string, val: any): any { + if (typeof typ === typeof val) return val; + return invalidValue(typ, val, key, parent); + } + + function transformUnion(typs: any[], val: any): any { + // val must validate against one typ in typs + const l = typs.length; + for (let i = 0; i < l; i++) { + const typ = typs[i]; + try { + return transform(val, typ, getProps); + } catch (_) {} + } + return invalidValue(typs, val, key, parent); + } + + function transformEnum(cases: string[], val: any): any { + if (cases.indexOf(val) !== -1) return val; + return invalidValue(cases.map(a => { return l(a); }), val, key, parent); + } + + function transformArray(typ: any, val: any): any { + // val must be an array with no invalid elements + if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent); + return val.map(el => transform(el, typ, getProps)); + } + + function transformDate(val: any): any { + if (val === null) { + return null; + } + const d = new Date(val); + if (isNaN(d.valueOf())) { + return invalidValue(l("Date"), val, key, parent); + } + return d; + } + + function transformObject(props: { [k: string]: any }, additional: any, val: any): any { + if (val === null || typeof val !== "object" || Array.isArray(val)) { + return invalidValue(l(ref || "object"), val, key, parent); + } + const result: any = {}; + Object.getOwnPropertyNames(props).forEach(key => { + const prop = props[key]; + const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; + result[prop.key] = transform(v, prop.typ, getProps, key, ref); + }); + Object.getOwnPropertyNames(val).forEach(key => { + if (!Object.prototype.hasOwnProperty.call(props, key)) { + result[key] = transform(val[key], additional, getProps, key, ref); + } + }); + return result; + } + + if (typ === "any") return val; + if (typ === null) { + if (val === null) return val; + return invalidValue(typ, val, key, parent); + } + if (typ === false) return invalidValue(typ, val, key, parent); + let ref: any = undefined; + while (typeof typ === "object" && typ.ref !== undefined) { + ref = typ.ref; + typ = typeMap[typ.ref]; + } + if (Array.isArray(typ)) return transformEnum(typ, val); + if (typeof typ === "object") { + return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) + : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val, key, parent); + } + // Numbers can be parsed by Date but shouldn't be. + if (typ === Date && typeof val !== "number") return transformDate(val); + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + "ZarfTypes": o([ + { json: "DeployedPackage", js: "DeployedPackage", typ: r("DeployedPackage") }, + { json: "ZarfState", js: "ZarfState", typ: r("ZarfState") }, + ], false), + "DeployedPackage": o([ + { json: "cliVersion", js: "cliVersion", typ: "" }, + { json: "componentWebhooks", js: "componentWebhooks", typ: u(undefined, m(m(r("Webhook")))) }, + { json: "connectStrings", js: "connectStrings", typ: u(undefined, m(r("ConnectString"))) }, + { json: "data", js: "data", typ: r("ZarfPackage") }, + { json: "deployedComponents", js: "deployedComponents", typ: a(r("DeployedComponent")) }, + { json: "generation", js: "generation", typ: 0 }, + { json: "name", js: "name", typ: "" }, + ], false), + "Webhook": o([ + { json: "name", js: "name", typ: "" }, + { json: "observedGeneration", js: "observedGeneration", typ: 0 }, + { json: "status", js: "status", typ: "" }, + { json: "waitDurationSeconds", js: "waitDurationSeconds", typ: u(undefined, 0) }, + ], false), + "ConnectString": o([ + { json: "description", js: "description", typ: "" }, + { json: "url", js: "url", typ: "" }, + ], false), + "ZarfPackage": o([ + { json: "build", js: "build", typ: u(undefined, r("ZarfBuildData")) }, + { json: "components", js: "components", typ: a(r("ZarfComponent")) }, + { json: "constants", js: "constants", typ: u(undefined, a(r("ZarfPackageConstant"))) }, + { json: "kind", js: "kind", typ: r("Kind") }, + { json: "metadata", js: "metadata", typ: u(undefined, r("ZarfMetadata")) }, + { json: "variables", js: "variables", typ: u(undefined, a(r("ZarfPackageVariable"))) }, + ], false), + "ZarfBuildData": o([ + { json: "architecture", js: "architecture", typ: "" }, + { json: "differential", js: "differential", typ: u(undefined, true) }, + { json: "differentialMissing", js: "differentialMissing", typ: u(undefined, a("")) }, + { json: "lastNonBreakingVersion", js: "lastNonBreakingVersion", typ: u(undefined, "") }, + { json: "migrations", js: "migrations", typ: u(undefined, a("")) }, + { json: "registryOverrides", js: "registryOverrides", typ: u(undefined, m("")) }, + { json: "terminal", js: "terminal", typ: "" }, + { json: "timestamp", js: "timestamp", typ: "" }, + { json: "user", js: "user", typ: "" }, + { json: "version", js: "version", typ: "" }, + ], false), + "ZarfComponent": o([ + { json: "actions", js: "actions", typ: u(undefined, r("ZarfComponentActions")) }, + { json: "charts", js: "charts", typ: u(undefined, a(r("ZarfChart"))) }, + { json: "cosignKeyPath", js: "cosignKeyPath", typ: u(undefined, "") }, + { json: "dataInjections", js: "dataInjections", typ: u(undefined, a(r("ZarfDataInjection"))) }, + { json: "default", js: "default", typ: u(undefined, true) }, + { json: "description", js: "description", typ: u(undefined, "") }, + { json: "extensions", js: "extensions", typ: u(undefined, r("ZarfComponentExtensions")) }, + { json: "files", js: "files", typ: u(undefined, a(r("ZarfFile"))) }, + { json: "group", js: "group", typ: u(undefined, "") }, + { json: "images", js: "images", typ: u(undefined, a("")) }, + { json: "import", js: "import", typ: u(undefined, r("ZarfComponentImport")) }, + { json: "manifests", js: "manifests", typ: u(undefined, a(r("ZarfManifest"))) }, + { json: "name", js: "name", typ: "" }, + { json: "only", js: "only", typ: u(undefined, r("ZarfComponentOnlyTarget")) }, + { json: "repos", js: "repos", typ: u(undefined, a("")) }, + { json: "required", js: "required", typ: u(undefined, true) }, + { json: "scripts", js: "scripts", typ: u(undefined, r("DeprecatedZarfComponentScripts")) }, + ], false), + "ZarfComponentActions": o([ + { json: "onCreate", js: "onCreate", typ: u(undefined, r("ZarfComponentActionSet")) }, + { json: "onDeploy", js: "onDeploy", typ: u(undefined, r("ZarfComponentActionSet")) }, + { json: "onRemove", js: "onRemove", typ: u(undefined, r("ZarfComponentActionSet")) }, + ], false), + "ZarfComponentActionSet": o([ + { json: "after", js: "after", typ: u(undefined, a(r("ZarfComponentAction"))) }, + { json: "before", js: "before", typ: u(undefined, a(r("ZarfComponentAction"))) }, + { json: "defaults", js: "defaults", typ: u(undefined, r("ZarfComponentActionDefaults")) }, + { json: "onFailure", js: "onFailure", typ: u(undefined, a(r("ZarfComponentAction"))) }, + { json: "onSuccess", js: "onSuccess", typ: u(undefined, a(r("ZarfComponentAction"))) }, + ], false), + "ZarfComponentAction": o([ + { json: "cmd", js: "cmd", typ: u(undefined, "") }, + { json: "description", js: "description", typ: u(undefined, "") }, + { json: "dir", js: "dir", typ: u(undefined, "") }, + { json: "env", js: "env", typ: u(undefined, a("")) }, + { json: "maxRetries", js: "maxRetries", typ: u(undefined, 0) }, + { json: "maxTotalSeconds", js: "maxTotalSeconds", typ: u(undefined, 0) }, + { json: "mute", js: "mute", typ: u(undefined, true) }, + { json: "setVariable", js: "setVariable", typ: u(undefined, "") }, + { json: "setVariables", js: "setVariables", typ: u(undefined, a(r("ZarfComponentActionSetVariable"))) }, + { json: "shell", js: "shell", typ: u(undefined, r("ZarfComponentActionShell")) }, + { json: "wait", js: "wait", typ: u(undefined, r("ZarfComponentActionWait")) }, + ], false), + "ZarfComponentActionSetVariable": o([ + { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) }, + { json: "name", js: "name", typ: "" }, + { json: "pattern", js: "pattern", typ: u(undefined, "") }, + { json: "sensitive", js: "sensitive", typ: u(undefined, true) }, + { json: "type", js: "type", typ: u(undefined, r("Type")) }, + ], false), + "ZarfComponentActionShell": o([ + { json: "darwin", js: "darwin", typ: u(undefined, "") }, + { json: "linux", js: "linux", typ: u(undefined, "") }, + { json: "windows", js: "windows", typ: u(undefined, "") }, + ], false), + "ZarfComponentActionWait": o([ + { json: "cluster", js: "cluster", typ: u(undefined, r("ZarfComponentActionWaitCluster")) }, + { json: "network", js: "network", typ: u(undefined, r("ZarfComponentActionWaitNetwork")) }, + ], false), + "ZarfComponentActionWaitCluster": o([ + { json: "condition", js: "condition", typ: u(undefined, "") }, + { json: "kind", js: "kind", typ: "" }, + { json: "name", js: "name", typ: "" }, + { json: "namespace", js: "namespace", typ: u(undefined, "") }, + ], false), + "ZarfComponentActionWaitNetwork": o([ + { json: "address", js: "address", typ: "" }, + { json: "code", js: "code", typ: u(undefined, 0) }, + { json: "protocol", js: "protocol", typ: r("Protocol") }, + ], false), + "ZarfComponentActionDefaults": o([ + { json: "dir", js: "dir", typ: u(undefined, "") }, + { json: "env", js: "env", typ: u(undefined, a("")) }, + { json: "maxRetries", js: "maxRetries", typ: u(undefined, 0) }, + { json: "maxTotalSeconds", js: "maxTotalSeconds", typ: u(undefined, 0) }, + { json: "mute", js: "mute", typ: u(undefined, true) }, + { json: "shell", js: "shell", typ: u(undefined, r("ZarfComponentActionShell")) }, + ], false), + "ZarfChart": o([ + { json: "gitPath", js: "gitPath", typ: u(undefined, "") }, + { json: "localPath", js: "localPath", typ: u(undefined, "") }, + { json: "name", js: "name", typ: "" }, + { json: "namespace", js: "namespace", typ: "" }, + { json: "noWait", js: "noWait", typ: u(undefined, true) }, + { json: "releaseName", js: "releaseName", typ: u(undefined, "") }, + { json: "url", js: "url", typ: u(undefined, "") }, + { json: "valuesFiles", js: "valuesFiles", typ: u(undefined, a("")) }, + { json: "version", js: "version", typ: u(undefined, "") }, + ], false), + "ZarfDataInjection": o([ + { json: "compress", js: "compress", typ: u(undefined, true) }, + { json: "source", js: "source", typ: "" }, + { json: "target", js: "target", typ: r("ZarfContainerTarget") }, + ], false), + "ZarfContainerTarget": o([ + { json: "container", js: "container", typ: "" }, + { json: "namespace", js: "namespace", typ: "" }, + { json: "path", js: "path", typ: "" }, + { json: "selector", js: "selector", typ: "" }, + ], false), + "ZarfComponentExtensions": o([ + { json: "bigbang", js: "bigbang", typ: u(undefined, r("BigBang")) }, + ], false), + "BigBang": o([ + { json: "fluxPatchFiles", js: "fluxPatchFiles", typ: u(undefined, a("")) }, + { json: "repo", js: "repo", typ: u(undefined, "") }, + { json: "skipFlux", js: "skipFlux", typ: u(undefined, true) }, + { json: "valuesFiles", js: "valuesFiles", typ: u(undefined, a("")) }, + { json: "version", js: "version", typ: "" }, + ], false), + "ZarfFile": o([ + { json: "executable", js: "executable", typ: u(undefined, true) }, + { json: "extractPath", js: "extractPath", typ: u(undefined, "") }, + { json: "shasum", js: "shasum", typ: u(undefined, "") }, + { json: "source", js: "source", typ: "" }, + { json: "symlinks", js: "symlinks", typ: u(undefined, a("")) }, + { json: "target", js: "target", typ: "" }, + ], false), + "ZarfComponentImport": o([ + { json: "name", js: "name", typ: u(undefined, "") }, + { json: "path", js: "path", typ: u(undefined, "") }, + { json: "url", js: "url", typ: u(undefined, "") }, + ], false), + "ZarfManifest": o([ + { json: "files", js: "files", typ: u(undefined, a("")) }, + { json: "kustomizations", js: "kustomizations", typ: u(undefined, a("")) }, + { json: "kustomizeAllowAnyDirectory", js: "kustomizeAllowAnyDirectory", typ: u(undefined, true) }, + { json: "name", js: "name", typ: "" }, + { json: "namespace", js: "namespace", typ: u(undefined, "") }, + { json: "noWait", js: "noWait", typ: u(undefined, true) }, + ], false), + "ZarfComponentOnlyTarget": o([ + { json: "cluster", js: "cluster", typ: u(undefined, r("ZarfComponentOnlyCluster")) }, + { json: "flavor", js: "flavor", typ: u(undefined, "") }, + { json: "localOS", js: "localOS", typ: u(undefined, r("LocalOS")) }, + ], false), + "ZarfComponentOnlyCluster": o([ + { json: "architecture", js: "architecture", typ: u(undefined, r("Architecture")) }, + { json: "distros", js: "distros", typ: u(undefined, a("")) }, + ], false), + "DeprecatedZarfComponentScripts": o([ + { json: "after", js: "after", typ: u(undefined, a("")) }, + { json: "before", js: "before", typ: u(undefined, a("")) }, + { json: "prepare", js: "prepare", typ: u(undefined, a("")) }, + { json: "retry", js: "retry", typ: u(undefined, true) }, + { json: "showOutput", js: "showOutput", typ: u(undefined, true) }, + { json: "timeoutSeconds", js: "timeoutSeconds", typ: u(undefined, 0) }, + ], false), + "ZarfPackageConstant": o([ + { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) }, + { json: "description", js: "description", typ: u(undefined, "") }, + { json: "name", js: "name", typ: "" }, + { json: "pattern", js: "pattern", typ: u(undefined, "") }, + { json: "value", js: "value", typ: "" }, + ], false), + "ZarfMetadata": o([ + { json: "aggregateChecksum", js: "aggregateChecksum", typ: u(undefined, "") }, + { json: "architecture", js: "architecture", typ: u(undefined, "") }, + { json: "authors", js: "authors", typ: u(undefined, "") }, + { json: "description", js: "description", typ: u(undefined, "") }, + { json: "documentation", js: "documentation", typ: u(undefined, "") }, + { json: "image", js: "image", typ: u(undefined, "") }, + { json: "name", js: "name", typ: "" }, + { json: "source", js: "source", typ: u(undefined, "") }, + { json: "uncompressed", js: "uncompressed", typ: u(undefined, true) }, + { json: "url", js: "url", typ: u(undefined, "") }, + { json: "vendor", js: "vendor", typ: u(undefined, "") }, + { json: "version", js: "version", typ: u(undefined, "") }, + { json: "yolo", js: "yolo", typ: u(undefined, true) }, + ], false), + "ZarfPackageVariable": o([ + { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) }, + { json: "default", js: "default", typ: u(undefined, "") }, + { json: "description", js: "description", typ: u(undefined, "") }, + { json: "name", js: "name", typ: "" }, + { json: "pattern", js: "pattern", typ: u(undefined, "") }, + { json: "prompt", js: "prompt", typ: u(undefined, true) }, + { json: "sensitive", js: "sensitive", typ: u(undefined, true) }, + { json: "type", js: "type", typ: u(undefined, r("Type")) }, + ], false), + "DeployedComponent": o([ + { json: "installedCharts", js: "installedCharts", typ: a(r("InstalledChart")) }, + { json: "name", js: "name", typ: "" }, + { json: "observedGeneration", js: "observedGeneration", typ: 0 }, + { json: "status", js: "status", typ: "" }, + ], false), + "InstalledChart": o([ + { json: "chartName", js: "chartName", typ: "" }, + { json: "namespace", js: "namespace", typ: "" }, + ], false), + "ZarfState": o([ + { json: "agentTLS", js: "agentTLS", typ: r("GeneratedPKI") }, + { json: "architecture", js: "architecture", typ: "" }, + { json: "artifactServer", js: "artifactServer", typ: r("ArtifactServerInfo") }, + { json: "distro", js: "distro", typ: "" }, + { json: "gitServer", js: "gitServer", typ: r("GitServerInfo") }, + { json: "loggingSecret", js: "loggingSecret", typ: "" }, + { json: "registryInfo", js: "registryInfo", typ: r("RegistryInfo") }, + { json: "storageClass", js: "storageClass", typ: "" }, + { json: "zarfAppliance", js: "zarfAppliance", typ: true }, + ], false), + "GeneratedPKI": o([ + { json: "ca", js: "ca", typ: "" }, + { json: "cert", js: "cert", typ: "" }, + { json: "key", js: "key", typ: "" }, + ], false), + "ArtifactServerInfo": o([ + { json: "address", js: "address", typ: "" }, + { json: "internalServer", js: "internalServer", typ: true }, + { json: "pushPassword", js: "pushPassword", typ: "" }, + { json: "pushUsername", js: "pushUsername", typ: "" }, + ], false), + "GitServerInfo": o([ + { json: "address", js: "address", typ: "" }, + { json: "internalServer", js: "internalServer", typ: true }, + { json: "pullPassword", js: "pullPassword", typ: "" }, + { json: "pullUsername", js: "pullUsername", typ: "" }, + { json: "pushPassword", js: "pushPassword", typ: "" }, + { json: "pushUsername", js: "pushUsername", typ: "" }, + ], false), + "RegistryInfo": o([ + { json: "address", js: "address", typ: "" }, + { json: "internalRegistry", js: "internalRegistry", typ: true }, + { json: "nodePort", js: "nodePort", typ: 0 }, + { json: "pullPassword", js: "pullPassword", typ: "" }, + { json: "pullUsername", js: "pullUsername", typ: "" }, + { json: "pushPassword", js: "pushPassword", typ: "" }, + { json: "pushUsername", js: "pushUsername", typ: "" }, + { json: "secret", js: "secret", typ: "" }, + ], false), + "Type": [ + "file", + "raw", + ], + "Protocol": [ + "http", + "https", + "tcp", + ], + "Architecture": [ + "amd64", + "arm64", + ], + "LocalOS": [ + "darwin", + "linux", + "windows", + ], + "Kind": [ + "ZarfInitConfig", + "ZarfPackageConfig", + ], +}; diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..c218cf9 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,96 @@ +# Update the Zarf ECR init package + +## Update the Pepr module + +### Run unit tests + +When making changes to the Pepr *.ts files are made, you can run the unit tests locally to test your changes: + +```bash +make test-module +``` + +### Format the Pepr module + +```bash +make format-ts +``` + +### Rebuild the Pepr module + +```bash +make build-module +``` + +## Build the AWS init package + +```bash +make aws-init-package +``` + +## Create EKS cluster + +```bash +make deploy-eks-package CLUSTER_NAME=my-cluster-name +``` + +## Create IAM roles to authenticate to ECR + +Note: The EKS cluster that is provided via CLUSTER_NAME must be ready/available + +```bash +make create-iam CLUSTER_NAME=my-cluster-name +``` + +## Update the Zarf config file with registry type and IAM role ARNs + +```bash +# Change REGISTRY_TYPE to public as needed +make update-zarf-config REGISTRY_TYPE="private" +``` + +## Zarf init + +### Private ECR registry + +```bash +make deploy-init-package-private +``` + +### Public ECR registry + +```bash +make deploy-init-package-public +``` + +## Cleanup + +### Remove Zarf from the cluster + +```bash +make destroy +``` + +### Teardown the cluster + +```bash +make remove-eks-package +``` + +### Delete IAM roles + +```bash +make delete-iam +``` + +### Delete private ECR repositories + +```bash +make delete-private-repos +``` + +### Delete public ECR repositories + +```bash +make delete-public-repos +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f340b22 --- /dev/null +++ b/go.mod @@ -0,0 +1,54 @@ +module main + +go 1.21.3 + +require ( + github.com/aws/aws-sdk-go v1.47.0 + k8s.io/apimachinery v0.28.3 + k8s.io/client-go v0.28.3 + k8s.io/klog/v2 v2.110.1 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.13.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7ea5b88 --- /dev/null +++ b/go.sum @@ -0,0 +1,175 @@ +github.com/aws/aws-sdk-go v1.47.0 h1:/JUg9V1+xh+qBn8A6ec/l15ETPaMaBqxkjz+gg63dNk= +github.com/aws/aws-sdk-go v1.47.0/go.mod h1:DlEaEbWKZmsITVbqlSVvekPARM1HzeV9PMYg15ymSDA= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +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/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a h1:PEOGDI1kkyW37YqPWHLHc+D20D9+87Wt12TCcfTUo5Q= +github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +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/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20210615035016-665e8c7367d1/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/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.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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +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= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/go.work b/go.work new file mode 100644 index 0000000..0e23391 --- /dev/null +++ b/go.work @@ -0,0 +1,6 @@ +go 1.21.3 + +use ( + . + ./hack/gen-schema +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..b81384c --- /dev/null +++ b/go.work.sum @@ -0,0 +1,636 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= +cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= +cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= +cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= +cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= +cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= +cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= +cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= +cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= +cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= +cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= +cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= +cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= +cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= +cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= +cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= +cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= +cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= +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 v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= +cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= +cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= +cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= +cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= +cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= +cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= +cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= +cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= +cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= +cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= +cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= +cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= +cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= +cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= +cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= +cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= +cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= +cloud.google.com/go/kms v1.15.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= +cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= +cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= +cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= +cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= +cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= +cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= +cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= +cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= +cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= +cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= +cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= +cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= +cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= +cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= +cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= +cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= +cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= +cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= +cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= +cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= +cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= +cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= +cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CycloneDX/cyclonedx-go v0.7.1/go.mod h1:N/nrdWQI2SIjaACyyDs/u7+ddCkyl/zkNs8xFsHF2Ps= +github.com/DataDog/appsec-internal-go v1.0.0/go.mod h1:+Y+4klVWKPOnZx6XESG7QHydOaUGEXyH2j/vSg9JiNM= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.45.0-rc.1/go.mod h1:e933RWa4kAWuHi5jpzEuOiULlv21HcCFEVIYegmaB5c= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.46.0-rc.4/go.mod h1:VVMDDibJxYEkwcLdZBT2g8EHKpbMT4JdOhRbQ9GdjbM= +github.com/DataDog/go-libddwaf v1.4.1/go.mod h1:qLZEuaF5amEVMP5NTYtr/6m30m73voPL4i7SK7dnnt4= +github.com/DataDog/go-tuf v0.3.0--fix-localmeta-fork/go.mod h1:yA5JwkZsHTLuqq3zaRgUQf35DfDkpOZqgtBqHKpwrBs= +github.com/DataDog/sketches-go v1.2.1/go.mod h1:1xYmPLY1So10AwxV6MJV0J53XVH+WL9Ad1KetxVivVI= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Microsoft/hcsshim v0.11.0/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/alibabacloud-go/darabonba-openapi v0.1.18/go.mod h1:PB4HffMhJVmAgNKNq3wYbTUlFvPgxJpTzd1F5pTuUsc= +github.com/alibabacloud-go/tea v1.1.18/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea-utils v1.4.4/go.mod h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw= +github.com/aliyun/credentials-go v1.2.3/go.mod h1:/KowD1cfGSLrLsH28Jr8W+xwoId0ywIy5lNzDz6O1vw= +github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb/go.mod h1:DmTY2Mfcv38hsHbG78xMiTDdxFtkHpgYNVDPsF2TgHk= +github.com/anchore/stereoscope v0.0.0-20230925132944-bf05af58eb44/go.mod h1:RtbeDCho0pxkPqrB1QNf/Jlxfc9juLmtYZAf2UbpJfk= +github.com/anchore/syft v0.84.1/go.mod h1:dozEWcwhRawdB3ArPM2BGfZWLslZ+bDNwW+wWUwKySY= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/aws/aws-sdk-go v1.45.0 h1:qoVOQHuLacxJMO71T49KeE70zm+Tk3vtrl7XO4VUPZc= +github.com/aws/aws-sdk-go v1.45.0/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= +github.com/aws/aws-sdk-go-v2/config v1.18.37/go.mod h1:8AnEFxW9/XGKCbjYDCJy7iltVNyEI9Iu9qC21UzhhgQ= +github.com/aws/aws-sdk-go-v2/credentials v1.13.35/go.mod h1:o7rCaLtvK0hUggAGclf76mNGGkaG5a9KWlp+d9IpcV8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= +github.com/aws/aws-sdk-go-v2/service/ecr v1.15.0/go.mod h1:4zYI85WiYDhFaU1jPFVfkD7HlBcdnITDE3QxDwy4Kus= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.12.0/go.mod h1:IArQ3IBR00FkuraKwudKZZU32OxJfdTdwV+W5iZh3Y4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/kms v1.24.5/go.mod h1:NZEhPgq+vvmM6L9w+xl78Vf7YxqUcpVULqFdrUhHg8I= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.5/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.5/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220517224237-e6f29200ae04/go.mod h1:Z+bXnIbhKJYSvxNwsNnwde7pDKxuqlEZCbUBoTwAqf0= +github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/buildkite/agent/v3 v3.52.1/go.mod h1:MSIR+qpVb1Z663HlSqKEoIc4kkhmUFf4XazdCkxyE8E= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chrismellard/docker-credential-acr-env v0.0.0-20220119192733-fe33c00cee21/go.mod h1:Zlre/PVxuSI9y6/UV4NwGixQ48RHQDSPiUkofr6rbMU= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/clbanning/mxj/v2 v2.5.6/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +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-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-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-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/containerd v1.7.6/go.mod h1:SY6lrkkuJT40BVNO37tlYTSnKJnP5AXBc0fhx0q+TJ4= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/coreos/go-oidc/v3 v3.6.0/go.mod h1:ZpHUsHBucTUj6WOkrP4E20UPynbLZzhTQ1XKCXkxyPc= +github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/digitorus/timestamp v0.0.0-20230821155606-d1ad5ca9624c/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y= +github.com/distribution/distribution v2.8.2+incompatible/go.mod h1:EgLm2NgWtdKgzF9NpMzUKgzmR7AMmb0VQi2B+ZzDRjc= +github.com/docker/cli v24.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/ebitengine/purego v0.4.0-alpha.4.0.20230519103000-ee8dcecc618f/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +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.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.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fluxcd/helm-controller/api v0.36.0/go.mod h1:zkcRy3PxG0NoxSY5SjiSA5tWOGa6spIbWsChQY8FXqM= +github.com/fluxcd/source-controller/api v1.1.0/go.mod h1:ZLkaUd1KQIjtLPCvO63Ni5zpnSTVBAkeRgFBzMItbDQ= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/github/go-spdx/v2 v2.1.2/go.mod h1:hMCrsFgT0QnCwn7G8gxy/MxMpy67WgZrwFeISTn0o6w= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-git/go-git/v5 v5.9.0/go.mod h1:RKIqga24sWdMGZF+1Ekv9kylsDz6LzdTSI2s/OsZWE0= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +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/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +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/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 v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +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= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/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-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +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/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/vault/api v1.9.2/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b/go.mod h1:hQmNrgofl+IY/8L+n20H6E6PWBBTokdsv+q49j0QhsU= +github.com/jellydator/ttlcache/v3 v3.0.1/go.mod h1:WwTaEmcXQ3MTjOm4bsZoDFiCu/hMvNWLO1w67RXz6h4= +github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/knqyf263/go-rpmdb v0.0.0-20230301153543-ba94b245509b/go.mod h1:9LQcoMCMQ9vrF7HcDtXfvqGO4+ddxFQ8+YF/0CVGDww= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/jwx/v2 v2.0.11/go.mod h1:ZtPtMFlrfDrH2Y0iwfa3dRFn8VzwBrB+cyrm3IBWdDg= +github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf/go.mod h1:aGkAgvWY/IUcVFfuly53REpfv5edu25oij+qHRFaraA= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/microsoft/go-rustaudit v0.0.0-20220730194248-4b17361d90a5/go.mod h1:vYT9HE7WCvL64iVeZylKmCsWKfE+JZ8105iuh2Trk8g= +github.com/moby/moby v24.0.6+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/open-policy-agent/opa v0.55.0/go.mod h1:2Vh8fj/bXCqSwGMbBiHGrw+O8yrho6T/fdaHt5ROmaQ= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= +github.com/otiai10/copy v1.12.0/go.mod h1:rSaLseMUsZFFbsFGc7wCJnnkTAvdc5L6VWxPE4308Ww= +github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +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.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/puzpuzpuz/xsync/v2 v2.4.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/sigstore/fulcio v1.4.0/go.mod h1:wcjlktbhoy6+ZTxO3yXpvqUxsLV+JEH4FF3a5Jz4VPI= +github.com/sigstore/rekor v1.2.2/go.mod h1:FGnWBGWzeNceJnp0x9eDFd41mI8aQqCjj+Zp0IEs0Qg= +github.com/sigstore/sigstore v1.7.2/go.mod h1:2IPD5YXrXoznfnIoVsDF7ARC1Nha8xIdLpsC4kEQh5w= +github.com/sigstore/sigstore/pkg/signature/kms/aws v1.7.2/go.mod h1:GBGQtFm6XmC00DeGc1GI/PdETg7vrhzaHBgj5YCS9lY= +github.com/sigstore/sigstore/pkg/signature/kms/azure v1.7.2/go.mod h1:E4IGHXN9peBqP/PGVEF8VNAzPQIP17qSqcYAsXgnSRQ= +github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.7.2/go.mod h1:aN9UpIdLFf185H1+vmdxT+nty/ka8NPxUUvBigydaLk= +github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.7.2/go.mod h1:M7+ABfjRwfpKCTMCrhMweUrqKGoa4S6u53dB321MKdM= +github.com/sigstore/timestamp-authority v1.1.2/go.mod h1:7rGe/e6ZJNMqPiwFiv7w+qNXT8GID9gL7nMcRwZ007I= +github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +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.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/sylabs/sif/v2 v2.8.1/go.mod h1:LQOdYXC9a8i7BleTKRw9lohi0rTbXkJOeS9u0ebvgyM= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= +github.com/vifraa/gopom v0.2.1/go.mod h1:oPa1dcrGrtlO37WPDBm5SqHAT+wTgF8An1Q71Z6Vv4o= +github.com/xanzy/go-gitlab v0.90.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw= +go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.step.sm/crypto v0.35.0/go.mod h1:sBsrpVReoxmiLexbWL+vQRxZd6Gq4YBj/IRSUH+DZe4= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +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-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +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= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.138.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= +google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= +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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:itlFWGBbEyD32PUeJsTG8h8Wz7iJXfVK4gt1EJ+pAG0= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +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.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/DataDog/dd-trace-go.v1 v1.53.0/go.mod h1:m0tVxCbhcuHsiHhhaw749KeQcVjRZOWBPMa6wHL6LBQ= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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= +helm.sh/helm/v3 v3.12.3/go.mod h1:KPKQiX9IP5HX7o5YnnhViMnNuKiL/lJBVQ47GHe1R0k= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +inet.af/netaddr v0.0.0-20220811202034-502d2d690317/go.mod h1:OIezDfdzOgFhuw4HuWapWq2e9l0H9tK4F1j+ETRtF3k= +k8s.io/apiextensions-apiserver v0.28.2/go.mod h1:5tnkxLGa9nefefYzWuAlWZ7RZYuN/765Au8cWLA6SRg= +k8s.io/apiserver v0.28.2/go.mod h1:f7D5e8wH8MWcKD7azq6Csw9UN+CjdtXIVQUyUhrtb+E= +k8s.io/cli-runtime v0.28.2/go.mod h1:bTpGOvpdsPtDKoyfG4EG041WIyFZLV9qq4rPlkyYfDA= +k8s.io/component-base v0.28.2/go.mod h1:4IuQPQviQCg3du4si8GpMrhAIegxpsgPngPRR/zWpzc= +k8s.io/component-helpers v0.28.2/go.mod h1:pF1R5YWQ+sgf0i6EbVm+MQCzkYuqutDUibdrkvAa6aI= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/metrics v0.28.2/go.mod h1:QTIIdjMrq+KodO+rmp6R9Pr1LZO8kTArNtkWoQXw0sw= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +oras.land/oras-go/v2 v2.3.0/go.mod h1:GeAwLuC4G/JpNwkd+bSZ6SkDMGaaYglt6YK2WvZP7uQ= +sigs.k8s.io/controller-runtime v0.16.0/go.mod h1:77DnuwA8+J7AO0njzv3wbNlMOnGuLrwFr8JPNwx3J7g= +sigs.k8s.io/kustomize/api v0.14.0/go.mod h1:vmOXlC8BcmcUJQjiceUbcyQ75JBP6eg8sgoyzc+eLpQ= +sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3/go.mod h1:/d88dHCvoy7d0AKFT0yytezSGZKjsZBVs9YTkBHSGFk= +sigs.k8s.io/kustomize/kyaml v0.14.3/go.mod h1:npvh9epWysfQ689Rtt/U+dpOJDTBn8kUnF1O6VzvmZA= +sigs.k8s.io/release-utils v0.7.4/go.mod h1:JEt2QPHItd5Pg2UKLAU8PEaSlF4bUjCZimpxFDgymVU= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/hack/.templates/grype.tmpl b/hack/.templates/grype.tmpl new file mode 100644 index 0000000..74952ec --- /dev/null +++ b/hack/.templates/grype.tmpl @@ -0,0 +1,4 @@ +"Package","Version","Fixed In","Vulnerability ID","Severity","Path(s)" +{{- range .Matches}} +"{{.Artifact.Name}}","{{.Artifact.Version}}","{{range .Vulnerability.Fix.Versions}}{{.}}{{end}}","{{.Vulnerability.ID}}","{{.Vulnerability.Severity}}","{{range .Artifact.Locations}}{{.RealPath}}{{end}}" +{{- end}} diff --git a/hack/ecr.sh b/hack/ecr.sh new file mode 100755 index 0000000..54f645b --- /dev/null +++ b/hack/ecr.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +REPO_NAME="defenseunicorns/pepr/controller" +ECR_CMD="ecr" + +# Validate the input for registry type +if [ "$ZARF_VAR_REGISTRY_TYPE" != "public" ] && [ "$ZARF_VAR_REGISTRY_TYPE" != "private" ]; then + echo "Error: Invalid registry type. Please specify 'public' or 'private'." + exit 1 +fi + +# When authenticating to a public registry, always authenticate to the us-east-1 region when using the AWS CLI. +# https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html#public-registry-auth +if [ "$ZARF_VAR_REGISTRY_TYPE" = "public" ]; then + + if [ "$ZARF_VAR_AWS_REGION" != "us-east-1" ]; then + echo "Error: Invalid region: ECR public registries are only available in the us-east-1 region." + exit 1 + fi + + ECR_CMD="ecr-public" +fi + +# Create an ECR repository for the Pepr controller image if it doesn't already exist +if ! aws "$ECR_CMD" describe-repositories \ + --repository-names "$REPO_NAME" \ + --region "$ZARF_VAR_AWS_REGION" >/dev/null 2>&1 +then + ARGS=("--repository-name" "$REPO_NAME" "--region" "$ZARF_VAR_AWS_REGION") + + if [ "$ZARF_VAR_REGISTRY_TYPE" = "private" ]; then + ARGS+=("--image-scanning-configuration" "scanOnPush=true" "--image-tag-mutability" "IMMUTABLE") + fi + + aws "$ECR_CMD" create-repository "${ARGS[@]}" +fi + diff --git a/hack/gen-schema/check-gen-schema.sh b/hack/gen-schema/check-gen-schema.sh new file mode 100755 index 0000000..b9ae55c --- /dev/null +++ b/hack/gen-schema/check-gen-schema.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + +if [ -z "$(git status -s capabilities/zarf-types.ts)" ]; then + echo "Success!" + exit 0 +else + git diff capabilities/zarf-types.ts + exit 1 +fi diff --git a/hack/gen-schema/gen-schema.sh b/hack/gen-schema/gen-schema.sh new file mode 100755 index 0000000..1b1c18d --- /dev/null +++ b/hack/gen-schema/gen-schema.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +# Create the json schema for the Zarf structs and use it to create the typescript definitions +go run hack/gen-schema/main.go | npx quicktype -s schema -o ./capabilities/zarf-types.ts diff --git a/hack/gen-schema/go.mod b/hack/gen-schema/go.mod new file mode 100644 index 0000000..ae34f81 --- /dev/null +++ b/hack/gen-schema/go.mod @@ -0,0 +1,74 @@ +module schema + +go 1.21.3 + +require ( + github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b + github.com/defenseunicorns/zarf v0.31.0 +) + +require ( + cuelang.org/go v0.6.0 // indirect + github.com/Masterminds/semver/v3 v3.2.1 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/proto v1.12.1 // indirect + github.com/fairwindsops/pluto/v5 v5.18.4 // indirect + github.com/fatih/color v1.15.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/goccy/go-yaml v1.11.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/moby/spdystream v0.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo/v2 v2.11.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect + github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.14.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/hack/gen-schema/go.sum b/hack/gen-schema/go.sum new file mode 100644 index 0000000..551bd58 --- /dev/null +++ b/hack/gen-schema/go.sum @@ -0,0 +1,241 @@ +cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= +cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b h1:doCpXjVwui6HUN+xgNsNS3SZ0/jUZ68Eb+mJRNOZfog= +github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/defenseunicorns/zarf v0.31.0 h1:7x100u+vKVgjLrLRAqM4WRnKWs7Hhwu2RN8l0LYLMkM= +github.com/defenseunicorns/zarf v0.31.0/go.mod h1:c9DnFmxf9rZq3fLP8DabG9fiQzSz1Cb4SgWivif9+5g= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE= +github.com/emicklei/proto v1.12.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/fairwindsops/pluto/v5 v5.18.4 h1:jwSWs5zl+yu3uRuzsiZ0huKo1U4p/B8lxGBtuDF2jbU= +github.com/fairwindsops/pluto/v5 v5.18.4/go.mod h1:X1S9WoMBn2bReAYjoGDZpdaoLI2CHb787IlDaDKsYYU= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= +github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-quicktest/qt v1.100.0 h1:I7iSLgIwNp0E0UnSvKJzs7ig0jg/Iq83zsZjtQNW7jY= +github.com/go-quicktest/qt v1.100.0/go.mod h1:leyLsQ4jksGmF1KaQEyabnqGIiJTbOU5S46QegToEj4= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/goccy/go-yaml v1.11.2 h1:joq77SxuyIs9zzxEjgyLBugMQ9NEgTWxXfz2wVqwAaQ= +github.com/goccy/go-yaml v1.11.2/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +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/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= +github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto= +github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk= +github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20210615035016-665e8c7367d1/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.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.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/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.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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +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-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/hack/gen-schema/main.go b/hack/gen-schema/main.go new file mode 100644 index 0000000..062ecda --- /dev/null +++ b/hack/gen-schema/main.go @@ -0,0 +1,26 @@ +// Package main generates a JSON schema from Zarf types and prints it to stdout +package main + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/alecthomas/jsonschema" + "github.com/defenseunicorns/zarf/src/types" +) + +type zarfTypes struct { + DeployedPackage types.DeployedPackage + ZarfState types.ZarfState +} + +func main() { + schema := jsonschema.Reflect(&zarfTypes{}) + output, err := json.MarshalIndent(schema, "", " ") + if err != nil { + fmt.Printf("unable to generate the JSON schema from the Zarf types: %v\n", err) + os.Exit(1) + } + fmt.Print(string(output) + "\n") +} diff --git a/hack/update-zarf-config/index.mjs b/hack/update-zarf-config/index.mjs new file mode 100644 index 0000000..67ca8fc --- /dev/null +++ b/hack/update-zarf-config/index.mjs @@ -0,0 +1,53 @@ +// This script reads zarf-config.example.yaml, adds the registry type and IAM role ARNs, and writes a new zarf-config.yaml file to be used for running zarf init. +// Execute this script via: `make update-zarf-config REGISTRY_TYPE=public|private` +// Assumes IAM roles already exist and were created via `make create-iam CLUSTER_NAME=my-cluster-name` +import { readFile, writeFile } from "fs"; +import { parseDocument } from "yaml"; + +const exampleFilePath = "../zarf-config.example.yaml"; +const updatedFilePath = "../zarf-config.yaml" +const args = process.argv.slice(2); + +// Validate registry type input +if (args[0] !== "private" && args[0] !== "public") { + console.log("First argument must be either 'public' or 'private' to specify ECR registry type"); + process.exit(1); +} + +// Validate role ARN inputs +if (!args[1]) { + console.log("Second argument must be an IAM role ARN for the ECR webhook"); + process.exit(1); +} +if (!args[2]) { + console.log("Third argument must be an IAM role ARN for the ECR credential helper"); + process.exit(1); +} + +readFile(exampleFilePath, "utf8", (err, configData) => { + if (err) { + console.error(err); + process.exit(1); + } + + const parsedConfig = parseDocument(configData); + + // Update Zarf config file values + if (parsedConfig.has("package") && parsedConfig.get("package").has("deploy")) { + const deployVars = parsedConfig.get("package").get("deploy").get("set") + deployVars.set("registry_type", args[0]); + deployVars.set("ecr_hook_role_arn", args[1]); + deployVars.set("ecr_credential_helper_role_arn", args[2]); + } + + const updatedConfig = parsedConfig.toString(); + + writeFile(updatedFilePath, updatedConfig, "utf8", (err) => { + if (err) { + console.error(err); + process.exit(1); + } + + console.log("Zarf config file updated successfully."); + }); +}); diff --git a/hack/update-zarf-config/package-lock.json b/hack/update-zarf-config/package-lock.json new file mode 100644 index 0000000..bbcd921 --- /dev/null +++ b/hack/update-zarf-config/package-lock.json @@ -0,0 +1,23 @@ +{ + "name": "update-zarf-config", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "update-zarf-config", + "version": "1.0.0", + "dependencies": { + "yaml": "^2.3.3" + } + }, + "node_modules/yaml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/hack/update-zarf-config/package.json b/hack/update-zarf-config/package.json new file mode 100644 index 0000000..c21f138 --- /dev/null +++ b/hack/update-zarf-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "update-zarf-config", + "version": "1.0.0", + "description": "A script to update the Zarf config file values", + "main": "index.mjs", + "dependencies": { + "yaml": "^2.3.3" + } +} diff --git a/iam/Pulumi.yaml b/iam/Pulumi.yaml new file mode 100644 index 0000000..8714f4a --- /dev/null +++ b/iam/Pulumi.yaml @@ -0,0 +1,5 @@ +name: iam +runtime: nodejs +description: IaC to provision IAM resources for IRSA authentication in CI +config: + aws:region: us-west-2 diff --git a/iam/index.ts b/iam/index.ts new file mode 100644 index 0000000..861b281 --- /dev/null +++ b/iam/index.ts @@ -0,0 +1,86 @@ +import { Output } from "@pulumi/pulumi"; +import { join } from "path"; +import { + createPolicy, + createRole, + attachPolicyToRole, + getAccountId, + getClusterId, +} from "./utils"; + +// Resource names +const webhookRoleName = "ecr-webhook-role"; +const webhookPolicyName = "ecr-webhook-policy"; +const credentialHelperRoleName = "ecr-credential-helper-role"; +const credentialHelperPolicyName = "ecr-credential-helper-policy"; + +// File names for IAM resources +const jsonFilesDir = join(__dirname, "json"); +const webhookPolicyPath = join(jsonFilesDir, "ecr-webhook-policy.json"); +const webhookRolePath = join(jsonFilesDir, "ecr-webhook-role.json"); +const credentialHelperPolicyPath = join( + jsonFilesDir, + "ecr-credential-helper-policy.json", +); +const credentialHelperRolePath = join( + jsonFilesDir, + "ecr-credential-helper-role.json", +); + +const main = async () => { + const clusterId = await getClusterId(); + const accountId = await getAccountId(); + + // Create webhook IAM policy + const webhookPolicy = createPolicy(webhookPolicyPath, webhookPolicyName); + + // Create webhook IAM role + const webhookRole = createRole( + webhookRolePath, + webhookRoleName, + accountId, + clusterId as string, + ); + + // Create credential helper IAM policy + const credentialHelperPolicy = createPolicy( + credentialHelperPolicyPath, + credentialHelperPolicyName, + ); + + // Create credential helper IAM role + const credentialHelperRole = createRole( + credentialHelperRolePath, + credentialHelperRoleName, + accountId, + clusterId as string, + ); + + // Attach webhook policy to role + attachPolicyToRole( + "ecr-webhook-policy-attachment", + webhookRole.name as unknown as string, + webhookPolicy.arn as unknown as string, + ); + + // Attach credential helper policy to role + attachPolicyToRole( + "ecr-credential-helper-policy-attachment", + credentialHelperRole.name as unknown as string, + credentialHelperPolicy.arn as unknown as string, + ); + + const webhookRoleArn = webhookRole.arn; + const credentialHelperRoleArn = credentialHelperRole.arn; + + return [webhookRoleArn, credentialHelperRoleArn]; +}; + +const outputs = main(); + +export const webhookRoleArn: Promise> = outputs.then( + result => result[0], +); +export const credentialHelperRoleArn: Promise> = outputs.then( + result => result[1], +); diff --git a/iam/json/ecr-credential-helper-policy.json b/iam/json/ecr-credential-helper-policy.json new file mode 100644 index 0000000..94b21d5 --- /dev/null +++ b/iam/json/ecr-credential-helper-policy.json @@ -0,0 +1,13 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ecr:GetAuthorizationToken", + "ecr-public:GetAuthorizationToken" + ], + "Resource": "*" + } + ] +} diff --git a/iam/json/ecr-credential-helper-role.json b/iam/json/ecr-credential-helper-role.json new file mode 100644 index 0000000..fc786a5 --- /dev/null +++ b/iam/json/ecr-credential-helper-role.json @@ -0,0 +1,17 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-west-2.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:zarf:zarf-ecr-credential-helper" + } + } + } + ] +} diff --git a/iam/json/ecr-webhook-policy.json b/iam/json/ecr-webhook-policy.json new file mode 100644 index 0000000..d79cb3c --- /dev/null +++ b/iam/json/ecr-webhook-policy.json @@ -0,0 +1,15 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ecr:DescribeRepositories", + "ecr:CreateRepository", + "ecr-public:DescribeRepositories", + "ecr-public:CreateRepository" + ], + "Resource": "*" + } + ] +} diff --git a/iam/json/ecr-webhook-role.json b/iam/json/ecr-webhook-role.json new file mode 100644 index 0000000..49da2c1 --- /dev/null +++ b/iam/json/ecr-webhook-role.json @@ -0,0 +1,17 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-west-2.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:pepr-system:pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0" + } + } + } + ] +} diff --git a/iam/package-lock.json b/iam/package-lock.json new file mode 100644 index 0000000..51e2abc --- /dev/null +++ b/iam/package-lock.json @@ -0,0 +1,2227 @@ +{ + "name": "iam", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iam", + "dependencies": { + "@pulumi/aws": "^6.6.1", + "@pulumi/pulumi": "^3.91.0", + "handlebars": "^4.7.8" + }, + "devDependencies": { + "@types/node": "^16" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.7.tgz", + "integrity": "sha512-yMaA/cIsRhGzW3ymCNpdlPcInXcovztlgu/rirThj2b87u3RzWUszliOqZ/pldy7yhmJPS8uwog+kZSTa4A0PQ==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@logdna/tail-file": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@logdna/tail-file/-/tail-file-2.2.0.tgz", + "integrity": "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==", + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.32.0.tgz", + "integrity": "sha512-g1WLhpG8B6iuDyZJFRGsR+JKyZ94m5LEmY2f+duEJ9Xb4XRlLHrZvh6G34OH6GJ8iDHxfHb/sWjJ1ZpkI9yGMQ==", + "deprecated": "Please use @opentelemetry/api >= 1.3.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.17.1.tgz", + "integrity": "sha512-up5I+RiQEkGrVEHtbAtmRgS+ZOnFh3shaDNHqZPBlGy+O92auL6yMmjzYpSKmJOGWowvs3fhVHePa8Exb5iHUg==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.17.1.tgz", + "integrity": "sha512-I6LrZvl1FF97FQXPR0iieWQmKnGxYtMbWA1GrAXnLUR+B1Hn2m8KqQNEIlZAucyv00GBgpWkpllmULmZfG8P3g==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.17.1.tgz", + "integrity": "sha512-FaLZlIhdpxlZiKu/G8OvA+so4xoCL1hCo/JgNdeSxzI4GnJrmFFbZT6DXgUzXJO7F9Qw3KDE1cBFUHawLVz58g==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/resources": "1.17.1", + "@opentelemetry/sdk-trace-base": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.32.0.tgz", + "integrity": "sha512-y6ADjHpkUz/v1nkyyYjsQa/zorhX+0qVGpFvXMcbjU4sHnBnC02c6wcc93sIgZfiQClIWo45TGku1KQxJ5UUbQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.32.0.tgz", + "integrity": "sha512-Az6wdkPx/Mi26lT9LKFV6GhCA9prwQFPz5eCNSExTnSP49YhQ7XCjzPd2POPeLKt84ICitrBMdE1mj0zbPdLAQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "@opentelemetry/instrumentation": "0.32.0", + "@opentelemetry/semantic-conventions": "1.6.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz", + "integrity": "sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.17.1.tgz", + "integrity": "sha512-XEbXYb81AM3ayJLlbJqITPIgKBQCuby45ZHiB9mchnmQOffh6ZJOmXONdtZAV7TWzmzwvAd28vGSUk57Aw/5ZA==", + "dependencies": { + "@opentelemetry/core": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.17.1.tgz", + "integrity": "sha512-p+P4lf2pbqd3YMfZO15QCGsDwR2m1ke2q5+dq6YBLa/q0qiC2eq4cD/qhYBBed5/X4PtdamaVGHGsp+u3GXHDA==", + "dependencies": { + "@opentelemetry/core": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.17.1.tgz", + "integrity": "sha512-M2e5emqg5I7qRKqlzKx0ROkcPyF8PbcSaWEdsm72od9txP7Z/Pl8PDYOyu80xWvbHAWk5mDxOF6v3vNdifzclA==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.17.1.tgz", + "integrity": "sha512-pfSJJSjZj5jkCJUQZicSpzN8Iz9UKMryPWikZRGObPnJo6cUSoKkjZh6BM3j+D47G4olMBN+YZKYqkFM1L6zNA==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/resources": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.17.1.tgz", + "integrity": "sha512-J56DaG4cusjw5crpI7x9rv4bxDF27DtKYGxXJF56KIvopbNKpdck5ZWXBttEyqgAVPDwHMAXWDL1KchHzF0a3A==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.17.1", + "@opentelemetry/core": "1.17.1", + "@opentelemetry/propagator-b3": "1.17.1", + "@opentelemetry/propagator-jaeger": "1.17.1", + "@opentelemetry/sdk-trace-base": "1.17.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.1.tgz", + "integrity": "sha512-xbR2U+2YjauIuo42qmE8XyJK6dYeRMLJuOlUP5SO4auET4VtOHOzgkRVOq+Ik18N+Xf3YPcqJs9dZMiDddz1eQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@pulumi/aws": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.6.1.tgz", + "integrity": "sha512-fpjiZ1BwTBbGdI+FiNlSN6//nXBDgLSUhl2+QMMYbB68reJUaVIRe/h73F1SxCwRm12fL9rFrsG2qEf5HYk6wA==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0", + "builtin-modules": "3.0.0", + "mime": "^2.0.0", + "read-package-tree": "^5.2.1", + "resolve": "^1.7.1" + } + }, + "node_modules/@pulumi/pulumi": { + "version": "3.91.0", + "resolved": "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.91.0.tgz", + "integrity": "sha512-xtCsfDyWK/tJXI/TrqgOUDdykYfcSBW2DLMBw3wZ4cCYG25OMg5e4uSo/0BJ2HAS4xr0cGeFL7FpADCPIWgFEQ==", + "dependencies": { + "@grpc/grpc-js": "^1.8.16", + "@logdna/tail-file": "^2.0.6", + "@opentelemetry/api": "^1.2.0", + "@opentelemetry/exporter-zipkin": "^1.6.0", + "@opentelemetry/instrumentation": "^0.32.0", + "@opentelemetry/instrumentation-grpc": "^0.32.0", + "@opentelemetry/resources": "^1.6.0", + "@opentelemetry/sdk-trace-base": "^1.6.0", + "@opentelemetry/sdk-trace-node": "^1.6.0", + "@opentelemetry/semantic-conventions": "^1.6.0", + "@pulumi/query": "^0.3.0", + "execa": "^5.1.0", + "google-protobuf": "^3.5.0", + "ini": "^2.0.0", + "js-yaml": "^3.14.0", + "minimist": "^1.2.6", + "normalize-package-data": "^3.0.0", + "pkg-dir": "^7.0.0", + "read-package-tree": "^5.3.1", + "require-from-string": "^2.0.1", + "semver": "^7.5.2", + "source-map-support": "^0.5.6", + "ts-node": "^7.0.1", + "typescript": "~3.8.3", + "upath": "^1.1.0" + }, + "engines": { + "node": ">=8.13.0 || >=10.10.0" + } + }, + "node_modules/@pulumi/query": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", + "integrity": "sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==" + }, + "node_modules/@types/node": { + "version": "16.18.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.59.tgz", + "integrity": "sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "engines": { + "node": "*" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "dependencies": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat": { + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "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.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/iam/package.json b/iam/package.json new file mode 100644 index 0000000..ed9aebe --- /dev/null +++ b/iam/package.json @@ -0,0 +1,12 @@ +{ + "name": "iam", + "main": "index.ts", + "devDependencies": { + "@types/node": "^16" + }, + "dependencies": { + "@pulumi/aws": "^6.6.1", + "@pulumi/pulumi": "^3.91.0", + "handlebars": "^4.7.8" + } +} diff --git a/iam/tsconfig.json b/iam/tsconfig.json new file mode 100644 index 0000000..2f316ea --- /dev/null +++ b/iam/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2020", + "module": "CommonJS", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.ts" + ] +} diff --git a/iam/utils.ts b/iam/utils.ts new file mode 100644 index 0000000..98ef966 --- /dev/null +++ b/iam/utils.ts @@ -0,0 +1,72 @@ +import { iam, getCallerIdentity } from "@pulumi/aws"; +import { getCluster } from "@pulumi/aws/eks"; +import { readFileSync } from "fs"; +import { compile } from "handlebars"; + +export function createPolicy(file: string, policyName: string) { + const policy = readFileSync(file, "utf8"); + return new iam.Policy(policyName, { + policy: policy, + }); +} + +export function createRole( + file: string, + roleName: string, + accountId: string, + clusterId: string, +) { + const placeholderRole = readFileSync(file, "utf8"); + const template = compile(placeholderRole); + + const updatedPlaceholders = { + AWS_ACCOUNT_ID: accountId, + EKS_CLUSTER_ID: clusterId, + }; + + const updatedRole = template(updatedPlaceholders); + + return new iam.Role(roleName, { + assumeRolePolicy: updatedRole, + }); +} + +export function attachPolicyToRole( + name: string, + roleName: string, + policyArn: string, +) { + return new iam.RolePolicyAttachment(name, { + role: roleName, + policyArn: policyArn, + }); +} + +export async function getClusterId(): Promise { + const clusterName = process.env.CLUSTER_NAME; + + if (!clusterName) { + throw new Error( + "CLUSTER_NAME environment variable must be set with a valid EKS cluster name", + ); + } + + try { + const cluster = await getCluster({ + name: clusterName, + }); + const oidcIssuer = cluster.identities[0].oidcs[0].issuer; + const clusterId = oidcIssuer.split("/").pop(); + if (clusterId === undefined) { + throw new Error("EKS cluster OIDC provider ID is undefined"); + } + return clusterId; + } catch (err) { + throw new Error(`Failed to get EKS cluster info: ${err}`); + } +} + +export async function getAccountId(): Promise { + const callerId = await getCallerIdentity({}); + return callerId.accountId; +} diff --git a/jest.config.json b/jest.config.json new file mode 100644 index 0000000..2717f58 --- /dev/null +++ b/jest.config.json @@ -0,0 +1,4 @@ +{ + "preset": "ts-jest", + "testEnvironment": "node" +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..fc0ced4 --- /dev/null +++ b/main.go @@ -0,0 +1,155 @@ +// Package main updates Zarf image pull secrets with new ECR tokens +package main + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "os" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ecr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/klog/v2" +) + +const ( + zarfNamespace = "zarf" + zarfImagePullSecret = "private-registry" + zarfStateSecret = "zarf-state" + zarfAgentLabel = "zarf.dev/agent" + zarfManagedByLabel = "app.kubernetes.io/managed-by" +) + +func main() { + ctx, cancel := context.WithTimeout(context.TODO(), 30*time.Second) + defer cancel() + + clientset, err := newK8sClient() + if err != nil { + klog.Errorf("failed to create Kubernetes clientset: %v", err) + os.Exit(1) + } + + ecrURL, err := getECRURL(ctx, clientset) + if err != nil { + klog.Errorf("failed to get ECR URL from zarf-state secret: %v", err) + os.Exit(1) + } + + authToken, err := fetchECRToken() + if err != nil { + klog.Errorf("failed to fetch ECR token: %v", err) + os.Exit(1) + } + + err = updateZarfManagedImageSecrets(ctx, clientset, ecrURL, authToken) + if err != nil { + klog.Errorf("failed to update ECR image pull credentials: %v", err) + os.Exit(1) + } +} + +func newK8sClient() (*kubernetes.Clientset, error) { + config, err := rest.InClusterConfig() + if err != nil { + return nil, fmt.Errorf("failed to create Kubernetes config: %w", err) + } + + clientset, err := kubernetes.NewForConfig(config) + if err != nil { + return nil, fmt.Errorf("failed to create Kubernetes client: %w", err) + } + + return clientset, nil +} + +func getECRURL(ctx context.Context, clientset *kubernetes.Clientset) (string, error) { + secret, err := clientset.CoreV1().Secrets(zarfNamespace).Get(ctx, zarfStateSecret, metav1.GetOptions{}) + if err != nil { + return "", fmt.Errorf("failed to get secret '%s' in namespace '%s': %w", zarfStateSecret, zarfNamespace, err) + } + + var zarfState zarfState + if err = json.Unmarshal(secret.Data["state"], &zarfState); err != nil { + return "", fmt.Errorf("failed to unmarshal 'secret.data.state' from the '%s' secret", zarfStateSecret) + } + + return zarfState.RegistryInfo.Address, nil +} + +func fetchECRToken() (string, error) { + region := os.Getenv("AWS_REGION") + if region == "" { + return "", errors.New("AWS_REGION environment variable is not set") + } + + sess, err := session.NewSessionWithOptions(session.Options{ + Config: aws.Config{Region: aws.String(region)}, + }) + if err != nil { + return "", fmt.Errorf("failed to create AWS session: %w", err) + } + + ecrClient := ecr.New(sess) + + authOutput, err := ecrClient.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{}) + if err != nil { + return "", fmt.Errorf("error calling GetAuthorizationToken(): %w", err) + } + + if len(authOutput.AuthorizationData) == 0 { + return "", errors.New("No authorization data received") + } + + return *authOutput.AuthorizationData[0].AuthorizationToken, nil +} + +func updateZarfManagedImageSecrets(ctx context.Context, clientset *kubernetes.Clientset, ecrURL string, authToken string) error { + namespaces, err := clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{}) + if err != nil { + return fmt.Errorf("error listing namespaces: %w", err) + } + + for _, namespace := range namespaces.Items { + registrySecret, err := clientset.CoreV1().Secrets(namespace.Name).Get(ctx, zarfImagePullSecret, metav1.GetOptions{}) + if err != nil { + continue + } + + // Check if this is a Zarf managed secret or is in a namespace the Zarf agent will take action in + if registrySecret.Labels[zarfManagedByLabel] == "zarf" || + (namespace.Labels[zarfAgentLabel] != "skip" && namespace.Labels[zarfAgentLabel] != "ignore") { + + // Update the secret with the new ECR auth token + dockerConfigJSON := dockerConfig{ + Auths: dockerConfigEntry{ + ecrURL: dockerConfigEntryWithAuth{ + Auth: authToken, + }, + }, + } + dockerConfigData, err := json.Marshal(dockerConfigJSON) + if err != nil { + klog.Warningf("Failed to marshal docker config data for secret '%s' in namespace '%s': %v\n", registrySecret.Name, namespace.Name, err) + continue + } + + registrySecret.Data[".dockerconfigjson"] = dockerConfigData + + updatedRegistrySecret, err := clientset.CoreV1().Secrets(namespace.Name).Update(ctx, registrySecret, metav1.UpdateOptions{}) + if err != nil { + return fmt.Errorf("failed to update secret '%s' in namespace '%s': %w", updatedRegistrySecret.Name, namespace.Name, err) + } + } + + klog.Infof("Successfully updated secret '%s' in namespace '%s'\n", registrySecret.Name, namespace.Name) + } + + return nil +} diff --git a/manifests/kustomization.yaml b/manifests/kustomization.yaml new file mode 100644 index 0000000..91b97bf --- /dev/null +++ b/manifests/kustomization.yaml @@ -0,0 +1,7 @@ +resources: + - pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml + +patches: + - path: patches/add-service-account-annotation.patch.yaml + - path: patches/add-env-var.patch.yaml + - path: patches/replace-image-ref.patch.yaml diff --git a/manifests/patches/add-env-var.patch.yaml b/manifests/patches/add-env-var.patch.yaml new file mode 100644 index 0000000..f5550a1 --- /dev/null +++ b/manifests/patches/add-env-var.patch.yaml @@ -0,0 +1,16 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + spec: + containers: + - name: server + env: + - name: AWS_REGION + value: "###ZARF_VAR_AWS_REGION###" diff --git a/manifests/patches/add-service-account-annotation.patch.yaml b/manifests/patches/add-service-account-annotation.patch.yaml new file mode 100644 index 0000000..1444076 --- /dev/null +++ b/manifests/patches/add-service-account-annotation.patch.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_HOOK_ROLE_ARN###" diff --git a/manifests/patches/replace-image-ref.patch.yaml b/manifests/patches/replace-image-ref.patch.yaml new file mode 100644 index 0000000..ee8fa9f --- /dev/null +++ b/manifests/patches/replace-image-ref.patch.yaml @@ -0,0 +1,14 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + spec: + containers: + - name: server + image: "###ZARF_REGISTRY###/###ZARF_CONST_PEPR_IMAGE###:###ZARF_CONST_PEPR_IMAGE_TAG###" diff --git a/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml b/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml new file mode 100644 index 0000000..023583f --- /dev/null +++ b/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml @@ -0,0 +1,279 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pepr-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +rules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +subjects: + - kind: ServiceAccount + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-api-token + namespace: pepr-system +type: Opaque +data: + value: >- + NDJjNGUwYzRmOTRlNzI3MzY2NDMzYzY5ZmVmOTQwMDQ2ZTdjNjFiNTk1MTk2YTY5MzI3YzRhMDNkYzRjZGRkYQ== +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-tls + namespace: pepr-system +type: kubernetes.io/tls +data: + tls.crt: >- + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDd3pDQ0FhdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBQU1CNFhEVEl6TVRFd01URTRNVFV6DQpObG9YRFRJME1URXdNVEU0TVRVek5sb3dBRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DDQpnZ0VCQUxyaHM0MkRwMWtxSW5tQlpNei9hcVlxL2U4dGFycXAwbUI0MjNsRFdkemdzS25KQ3NhdDJvaDRDWGlYDQowbnR4Wkg5a2diVXROVGc2dmM2VlZSa0xMaXRuWUhaN0NySVIzVzdhVGdYbFY3T2VPaXRpdlh5RXVjQnJLNlhmDQo1eENISVBsR3NpZlYzcWJzMDk4eVoxbXY0a1ZSMHRnQTEvSTFrVE5senoxaWpnRitJYWpISDdzTzgvanBzSWJ6DQpteGxGRGtjRjFMZUM2UU5HZnRJaXZxcjJ2UUIrT0JlV0grOUE0N0htbXpkNW1wSjdyK3B6RnFiMDYwcFNlMEs5DQpld3QxOTZRekdKSW5MeDQxYzhMNGNtWXVGdXo3WEFXZVdtREpZVEpLLzZBRzVxeitSVkJhc25RTU42cThHbTQ0DQplNE5BajB0bVVVKzl4TGJOSSt3S2VwUTZVek1DQXdFQUFhTklNRVl3UkFZRFZSMFJCRDB3TzRJNWNHVndjaTFpDQpPVFZrWW1RNE1DMWxNRGM0TFRWbFlqa3RZV0ZtTXkxaVkySTVOVFkzTkRFM1pEQXVjR1Z3Y2kxemVYTjBaVzB1DQpjM1pqTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBcStQa3JuNG1ZV0JVUEtWb1VYNVZObjFRaFF2dFFMa2NlDQorTEdnZWtXamtPT0UzZVdFUnlRcVQvUTdMUW5vWVArUG1XWDdBbUFQZTNXckZvS0YzdmlhWkRDZmhmWi9nb3RHDQoyZnNWRHZZekUwb1pHNWIxa3Z5WGxsN3g1OFVObGVwYzNnam9GV3NSUlVhUC9ZaW8wZmtjZXgydm1jQmZzbTZFDQo3WGtHMkxxNmI5Q3FVMldvMi95RE41cnJBcFFac2RwL011cUZMaHFXUG1lMU9Ub2l6cFJmb2F6N21oZTNJQjkyDQprVEVBZ1ZoVXVkWmZONkUxQ2NpQWRYQis1MUxPdVY4WlB5KzlJVUpJTytqZUdQWWpuUEQyaVZCQnY4UEtBUHU1DQpDc0FpU0JSZTNNTTIvVUN4QVkyc0ptVDhtSnMrcXhOMCtudVhjR24rN3gwWS9BNGZHWmlRDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQo= + tls.key: >- + LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ0KTUlJRW9nSUJBQUtDQVFFQXV1R3pqWU9uV1NvaWVZRmt6UDlxcGlyOTd5MXF1cW5TWUhqYmVVTlozT0N3cWNrSw0KeHEzYWlIZ0plSmZTZTNGa2YyU0J0UzAxT0RxOXpwVlZHUXN1SzJkZ2Ruc0tzaEhkYnRwT0JlVlhzNTQ2SzJLOQ0KZklTNXdHc3JwZC9uRUljZytVYXlKOVhlcHV6VDN6Sm5XYS9pUlZIUzJBRFg4aldSTTJYUFBXS09BWDRocU1jZg0KdXc3eitPbXdodk9iR1VVT1J3WFV0NExwQTBaKzBpSytxdmE5QUg0NEY1WWY3MERqc2VhYk4zbWFrbnV2Nm5NVw0KcHZUclNsSjdRcjE3QzNYM3BETVlraWN2SGpWend2aHlaaTRXN1B0Y0JaNWFZTWxoTWtyL29BYm1yUDVGVUZxeQ0KZEF3M3Fyd2Fiamg3ZzBDUFMyWlJUNzNFdHMwajdBcDZsRHBUTXdJREFRQUJBb0gvVFBSNGpzU1QvUk5EUnZFMg0KTXFNWUNDUWNrWTZINVprS2tMcEVNK3lHVFBTaTFBRGQ4QW9iaWdFQytXS1VqVTFSd1hkS3BEa2NCTDJJU1NBYQ0KQjlQOTZGSTQ3dWhDVWR6ZDNENFVBQW1salY0MjEwaG1vZWo4dkpxRUFpL29wcXVXNkhOQTZhSHY1Y0JnczNuWA0KaVdOakcyMXp5d3E5RnA0d29xbStJeXFQWGY3RExlNE94UmU0NEw0N1ljU0VhMnlienBNc1gvN1RqOEJ4K29URQ0KU0Nvdll0eUlpd0lpMyswZzdCZWlOUkpxVlVjQVkvb0VrWUNKRzY1WlV3bk9BczVuaTFIWEJaTDErNDBOYjNpMQ0KcUFEQzlXK1I2dDFhWmlSb2xkSDBzUTBDWmt0MmdmQk44TFI5aUtPTWY2U2lMOFluWVRCaEpMQmpaMU1YTUMwMg0KM2IwQkFvR0JBTlp1R2RJQXArZG91MGQ0M3JxaFJ0Y0NSQ1ppVVdLWUVqcmtEL1VOdGI1OGk0MFVaTDV6NVFNNg0KTSs1MHp6eDRBdTBKU3pPVmQvb3dBQXVaVzVSK2NwWk42RmJtU2YxNnRNbHR6QzFna3E2RFNleFlvTDJOcmJrYg0KaWc5M21IWDhOUDA2bFNqMmNSV1FvdW9xZ3BCYW0rWVJTOFhnRk01ajNXT3J0WFppbEJScEFvR0JBTjhjWitOaQ0KQXZYdlhJWk9TZ2U2MG1KVkl6b3U2U0YzZVo5Wlg0eFNDVEhsZ1daQ0s1QTdwNll4RlBFWXBwVUNBUFRGWk56cw0KSk1SU29ab1JlK3UzOXQzVmFXMXpBVXoyZXF3MVlhL2pvckhTeWlpaWlCQjBwTUNzV00zUUhTYTZIMzBLL3g4aw0KRTNDQmhJS1ZQZzNZZjFKcGxNcXA1WE1SWEVLZmRaYkczTWM3QW9HQkFMRmZZOFpkdW9YbUVUeCsxQ2FtNzVVOQ0KRDZoOG5YdWo5VGgzbkdlRmpyZmlDQUdNUkFWeWtwYUgxNXRCVG9kamNuQW14dWtGazdnRmFwUXRxQjUrTmtUMA0KYnVNckhUc3EvRTYrbnkxTi9DZVUvRm9mdWQ3eVNpaWJpaWxmTVdNdlc1bTRrdGZPZXg1dWhRU1VZMm9MT1hnbg0KQ0huRzhROEVkb1pTN0FqZ1pFTTVBb0dBTEgrTzNOUDhnUzZYUnBZd3Y2L3NLLzZOQXhxK0ZwV3NwVEovRXc1OQ0KbFAwUVBPUHZxbG1yaTBMNHlVbEFXREhKSFFpTm9GNWN5dWNzSWYxZ3VOZTlIZXRsbHBXOGFhd3pOVXVFU3o5Yw0KZ0pqcEJ3ZTdtWVNhSTI5OFdyZ3FTRUlRNjdDWXg0NDdibEgycXRDM1NxMm1YenA5bVpvZkVEOGpKb3FGT21nNQ0KT21jQ2dZRUFwakl3VUVxUzN5RjE2bW9Ld0k0Wkg0MVY0WXlOR2R2VC9pdlp6SUQ2aEZVZ21yS2RtQU9oU1NVaA0Kdjc2dmdGVGhpUXdZRGRSWTFKR2txVlpaMnJpWUxma2xiU2VuZlhMd3hycUlzMFhJaWxLaGtPcG9GQmhLUjh4ZQ0KVUladGk1TUVrOW5jd05uVVVIVlBRbXNXNno0U3VmQmtxZ1R4VTludHJMZ0NzZFdqTDJvPQ0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0NCg== +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + labels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +spec: + replicas: 2 + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + metadata: + labels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + spec: + priorityClassName: system-node-critical + serviceAccountName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + containers: + - name: server + image: ghcr.io/defenseunicorns/pepr/controller:v0.15.0 + imagePullPolicy: IfNotPresent + command: + - node + - /app/node_modules/pepr/dist/controller.js + - 7c85a96322cecb671dc876d42ca8255ff97750c8fd177791d2a0be3600060ad3 + readinessProbe: + httpGet: + path: /healthz + port: 3000 + scheme: HTTPS + livenessProbe: + httpGet: + path: /healthz + port: 3000 + scheme: HTTPS + ports: + - containerPort: 3000 + resources: + requests: + memory: 64Mi + cpu: 100m + limits: + memory: 256Mi + cpu: 500m + env: + - name: PEPR_PRETTY_LOG + value: 'false' + - name: LOG_LEVEL + value: debug + volumeMounts: + - name: tls-certs + mountPath: /etc/certs + readOnly: true + - name: api-token + mountPath: /app/api-token + readOnly: true + - name: module + mountPath: /app/load + readOnly: true + volumes: + - name: tls-certs + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-tls + - name: api-token + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-api-token + - name: module + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-module +--- +apiVersion: v1 +kind: Service +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + ports: + - port: 443 + targetPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-watcher + namespace: pepr-system +spec: + selector: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-watcher + ports: + - port: 443 + targetPort: 3000 +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-module + namespace: pepr-system +type: Opaque +data: + module-7c85a96322cecb671dc876d42ca8255ff97750c8fd177791d2a0be3600060ad3.js.gz: >- + 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 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: peprstores.pepr.dev +spec: + group: pepr.dev + versions: + - name: v1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + properties: + data: + type: object + additionalProperties: + type: string + scope: Namespaced + names: + plural: peprstores + singular: peprstore + kind: PeprStore +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +rules: + - apiGroups: + - pepr.dev + resources: + - peprstores + resourceNames: + - '' + verbs: + - create + - get + - patch + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store +subjects: + - kind: ServiceAccount + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +webhooks: + - name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.pepr.dev + admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + caBundle: >- + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDdERDQ0FaeWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBY01Sb3dHQVlEVlFRREV4RlFaWEJ5DQpJRVZ3YUdWdFpYSmhiQ0JEUVRBZUZ3MHlNekV4TURFeE9ERTFNelphRncweU5ERXhNREV4T0RFMU16WmFNQUF3DQpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcG1Md0tZN3FweWhkcU5zMUE5M1IwDQpmTVlYcEpJdkN4Mk1KbEZmWXRsd0tKWHFUdUFHS0VRM0o3RTJ4R1lPVEF0cGl0bGt1QzlRcEZqNjRsd3F3bUdYDQp5TGQrTDN2Y2VjMEhmbCt2L3lvT2h3bEl0Tk1QZGdMZFJYUGRuRHFsUkczL0ZlQzRxZ2NFTHV1SFBPUU1IWFdmDQpPMXZXTHgvTVlTc0ViTitYWlhEMXhTSk4zNVJJWXlXTW52Z0R1TThPc25nbGJpbGJrZFdRZUFUMk1ybzRIc3FjDQpQM0ltNWV5TmJLT3dCcGpMQ0pVR1FtemQ1Z3BPRWNyaFpNWUQ1eDJDUWJRSGlNN3dVRCs5UjdBWmg0bGxpMUpZDQpKUjBwQ01xMDZHa0xPNFU4ckF2QU5wOU5iZnN3c2xYaE91akE2RDZOeUlOVU5oUEpQSmduV3RPcWpWaXBZZ3c1DQpBZ01CQUFHakhUQWJNQXdHQTFVZEV3UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnTDBNQTBHQ1NxR1NJYjNEUUVCDQpDd1VBQTRJQkFRQmFqblhhVTNFTWpoNURuNE5MK2dMd25NREVQdjluU2Z2aHVMdlFoaXNoY2pIUTU1cWlqR3RyDQo1TkRBYXpoVjlyVHkyMHBNSGZ3Nm9hUjU5aWo1bkhrZStKZnF2ck54eUNUV1U4R3F2eGZjWEZuTUhpQUJlNk0yDQpYN2UvLzNoUTQxSjJ5UHRpMnhZYStYNGVqTkVrdWlnL2ZLajdVeUlvWThjVXJpZzh6SUlCWUVHVUlPU2JnOWtMDQppRXZ5L2FCWWlRTE5Od2I2M2dHTmNYSVVRVTBHcDU5d0Z6cGx3U1B6aWlJMlF1emt5MmxGKzBKZkQvN0tXbjNZDQoxVElJay9CVU5JVTJjOGR0eTM5T0I2RDIzdEg2eWNQbWpVWWxwZTBLd1RpNVU4cG56d3N4SVdOMmJjYW1XOC9vDQp4QlBJaUpMUFJhOGVHeDVyWTQwRHl5K0NrcmFER0tXZA0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ0K + service: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + path: >- + /mutate/42c4e0c4f94e727366433c69fef940046e7c61b595196a69327c4a03dc4cddda + failurePolicy: Ignore + matchPolicy: Equivalent + timeoutSeconds: 10 + namespaceSelector: + matchExpressions: + - key: pepr.dev + operator: NotIn + values: + - ignore + - key: kubernetes.io/metadata.name + operator: NotIn + values: + - kube-system + - pepr-system + objectSelector: + matchExpressions: + - key: pepr.dev + operator: NotIn + values: + - ignore + - key: kubernetes.io/metadata.name + operator: NotIn + values: + - kube-system + - pepr-system + rules: + - apiGroups: + - '' + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - secrets + sideEffects: None diff --git a/manifests/zarf-ecr-credential-helper.yaml b/manifests/zarf-ecr-credential-helper.yaml new file mode 100644 index 0000000..0f8fdfe --- /dev/null +++ b/manifests/zarf-ecr-credential-helper.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: zarf-ecr-credential-helper + namespace: zarf + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_CREDENTIAL_HELPER_ROLE_ARN###" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + namespace: zarf + name: zarf-ecr-credential-helper +rules: +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["list"] +- apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "update"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: zarf-ecr-credential-helper + namespace: zarf +subjects: +- kind: ServiceAccount + name: zarf-ecr-credential-helper + namespace: zarf +roleRef: + kind: ClusterRole + name: zarf-ecr-credential-helper + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: zarf-ecr-credential-helper + namespace: zarf +spec: + schedule: "###ZARF_VAR_ECR_CREDENTIAL_HELPER_CRON_SCHEDULE###" + jobTemplate: + spec: + template: + spec: + serviceAccountName: zarf-ecr-credential-helper + imagePullSecrets: + - name: private-registry + containers: + - name: zarf-ecr-credential-helper + image: "###ZARF_REGISTRY###/###ZARF_CONST_CREDENTIAL_HELPER_IMAGE###:###ZARF_CONST_CREDENTIAL_HELPER_IMAGE_TAG###" + imagePullPolicy: IfNotPresent + env: + - name: AWS_REGION + value: "###ZARF_VAR_AWS_REGION###" + restartPolicy: OnFailure diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..765a63d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8025 @@ +{ + "name": "ecr", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ecr", + "version": "0.0.1", + "dependencies": { + "@aws-sdk/client-ecr": "^3.408.0", + "@aws-sdk/client-ecr-public": "^3.413.0", + "pepr": "^0.15.0" + }, + "devDependencies": { + "@jest/globals": "^29.6.4", + "@types/jest": "^29.5.5", + "jest": "^29.6.4", + "ts-jest": "^29.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-ecr": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.438.0.tgz", + "integrity": "sha512-6SC1jOHUQedQqjK6M+re0nbwWQ2AEl/VYdpv5cHNdOAy/vOXMMN8RNT1ppFmgU6ymNh+PCVQUangckCYHt8fOQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.438.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr-public": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr-public/-/client-ecr-public-3.438.0.tgz", + "integrity": "sha512-RHAZAtLusVc3PRyOf1N9utIQ60jsL2FTXyRFz+4ajf6OYUC7fp57/YQDQFC8rgrRu4rfakrqNcZezTgxWWl94g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.438.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.438.0.tgz", + "integrity": "sha512-L/xKq+K78PShLku8x5gM6lZDUp7LhFJ2ksKH7Vll+exSZq+QUaxuzjp4gqdzh6B0oIshv2jssQlUa0ScOmVRMg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.438.0.tgz", + "integrity": "sha512-UBxLZKVVvbR4LHwSNSqaKx22YBSOGkavrh4SyDP8o8XOlXeRxTCllfSfjL9K5Mktp+ZwQ2NiubNcwmvUcGKbbg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", + "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", + "dependencies": { + "@smithy/smithy-client": "^2.1.12" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.438.0.tgz", + "integrity": "sha512-WYPQR3pXoHJjn9/RMWipUhsUNFy6zhOiII6u8LJ5w84aNqIjV4+BdRYztRNGJD98jdtekhbkX0YKoSuZqP+unQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.438.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.438.0.tgz", + "integrity": "sha512-uaw3D2R0svyrC32qyZ2aOv/l0AT9eClh+eQsZJTQD3Kz9q+2VdeOBThQ8fsMfRtm26nUbZo6A/CRwxkm6okI+w==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.438.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.438.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.438.0.tgz", + "integrity": "sha512-Xykli/64xR18cBV5P0XFxcH120omtfAjC/cFy/9nFU/+dPvbk0uu1yEOZYteWHyGGkPN4PkHmbh60GiUCLQkWQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.438.0", + "@aws-sdk/token-providers": "3.438.0", + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@babel/code-frame": { + "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.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "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.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "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" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "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.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@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.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.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.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/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "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.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", + "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", + "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", + "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", + "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", + "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", + "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", + "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", + "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", + "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", + "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", + "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", + "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", + "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", + "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", + "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", + "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", + "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", + "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", + "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", + "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", + "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", + "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@glideapps/ts-necessities": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "peer": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-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/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "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", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kubernetes/client-node": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.0.0-rc3.tgz", + "integrity": "sha512-bTYMBZXVrjfi98N5EZbrmPtcT9NY+TddunSEc25DcsRF1c5c93e5jT+zFwId19hG8e/ue5deKe7YDQiRYFpMlQ==", + "dependencies": { + "@types/js-yaml": "^4.0.1", + "@types/node": "^20.3.1", + "@types/node-fetch": "^2.6.3", + "@types/stream-buffers": "^3.0.3", + "@types/tar": "^6.1.1", + "@types/underscore": "^1.8.9", + "@types/ws": "^8.5.4", + "byline": "^5.0.0", + "form-data": "^4.0.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "node-fetch": "^2.6.9", + "openid-client": "^5.4.2", + "rfc4648": "^1.3.0", + "stream-buffers": "^3.0.2", + "tar": "^6.1.11", + "tmp-promise": "^3.0.2", + "tslib": "^2.5.0", + "underscore": "^1.9.1", + "url-parse": "^1.4.3", + "ws": "^8.13.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", + "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", + "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", + "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", + "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", + "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "dependencies": { + "@smithy/types": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", + "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", + "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", + "dependencies": { + "@smithy/config-resolver": "^2.0.16", + "@smithy/credential-provider-imds": "^2.0.18", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", + "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", + "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "peer": true + }, + "node_modules/@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "peer": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "dev": true + }, + "node_modules/@types/stream-buffers": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.6.tgz", + "integrity": "sha512-Bmtln6lFtcSjfQ5UqbmL/i6ARjWs33Xxf/O9KwICslxCTIVN5DYhwq87AdZ64yASm+hHgaeMAg637H4GaxH3qQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tar": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.7.tgz", + "integrity": "sha512-57ovoJf/lFhugSbDqDgpulTfm78uwO0Pa3EwgO3Op2IAIDZaDE4Z/orZ2yl25QRr8NQa1xjms9ElcoHx4pUedQ==", + "dependencies": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "node_modules/@types/underscore": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.12.tgz", + "integrity": "sha512-beX81q12OQo809WJ/UYCvUDvJR3YQ4wtehYYQ6eNw5VLyd+KUNBRV4FgzZCHBmACbdPulH9F9ifhxzFFU9TWvQ==" + }, + "node_modules/@types/urijs": { + "version": "1.19.22", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.22.tgz", + "integrity": "sha512-qnYBwfN7O/+i6E1Kr8JaCKsrCLpRCiQ1XxkSxNIYuJ/5Aagt0+HlMX78DJMUrNzDULMz0eu2gcprlxJaDtACOw==" + }, + "node_modules/@types/ws": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", + "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "peer": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/type-utils": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", + "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "peer": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "peer": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", + "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "peer": 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.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==" + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/collection-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", + "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "peer": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.572", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.572.tgz", + "integrity": "sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", + "hasInstallScript": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", + "@esbuild/darwin-arm64": "0.19.4", + "@esbuild/darwin-x64": "0.19.4", + "@esbuild/freebsd-arm64": "0.19.4", + "@esbuild/freebsd-x64": "0.19.4", + "@esbuild/linux-arm": "0.19.4", + "@esbuild/linux-arm64": "0.19.4", + "@esbuild/linux-ia32": "0.19.4", + "@esbuild/linux-loong64": "0.19.4", + "@esbuild/linux-mips64el": "0.19.4", + "@esbuild/linux-ppc64": "0.19.4", + "@esbuild/linux-riscv64": "0.19.4", + "@esbuild/linux-s390x": "0.19.4", + "@esbuild/linux-x64": "0.19.4", + "@esbuild/netbsd-x64": "0.19.4", + "@esbuild/openbsd-x64": "0.19.4", + "@esbuild/sunos-x64": "0.19.4", + "@esbuild/win32-arm64": "0.19.4", + "@esbuild/win32-ia32": "0.19.4", + "@esbuild/win32-x64": "0.19.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "peer": true + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "peer": true + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "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, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "peer": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "peer": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/help-me/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "peer": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "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", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "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", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "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.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jose": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-base64": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", + "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/kubernetes-fluent-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kubernetes-fluent-client/-/kubernetes-fluent-client-1.8.0.tgz", + "integrity": "sha512-CMmIIjLiKQzYsjO4O5F7nK0Ep8SIq09oVs3QBu/4VrInlW+QulLvVYt1MLyv2RPNwKEv4AOuIX41KdJDpuLqhQ==", + "dependencies": { + "@kubernetes/client-node": "1.0.0-rc3", + "byline": "5.0.0", + "fast-json-patch": "3.1.1", + "http-status-codes": "2.3.0", + "node-fetch": "2.7.0", + "quicktype-core": "23.0.76", + "type-fest": "4.5.0", + "yargs": "17.7.2" + }, + "bin": { + "kubernetes-fluent-client": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/kubernetes-fluent-client/node_modules/type-fest": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.5.0.tgz", + "integrity": "sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "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" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openid-client": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz", + "integrity": "sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ==", + "dependencies": { + "jose": "^4.15.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pepr": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/pepr/-/pepr-0.15.0.tgz", + "integrity": "sha512-dM1rSWmamLphn6hTO0VOWBGK2LUDGik3Kv2lXr+HandXB492w5wEfjAp64hSNbm1N1P/CbMyahZGwF8kdXB4Fg==", + "dependencies": { + "express": "4.18.2", + "fast-json-patch": "3.1.1", + "kubernetes-fluent-client": "1.8.0", + "pino": "8.16.1", + "pino-pretty": "10.2.3", + "prom-client": "15.0.0", + "ramda": "0.29.1" + }, + "bin": { + "pepr": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/parser": "6.7.3", + "commander": "11.0.0", + "esbuild": "0.19.4", + "eslint": "8.50.0", + "node-forge": "1.3.1", + "prettier": "3.0.3", + "prompts": "2.4.2", + "typescript": "5.2.2", + "uuid": "9.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.1.tgz", + "integrity": "sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.2.3.tgz", + "integrity": "sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-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/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz", + "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==" + }, + "node_modules/prom-client": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.0.0.tgz", + "integrity": "sha512-UocpgIrKyA2TKLVZDSfm8rGkL13C19YrQBAiG3xo3aDFWcHedxRxI3z+cIcucoxpSO0h5lff5iv/SXoxyeopeA==", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quicktype-core": { + "version": "23.0.76", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.76.tgz", + "integrity": "sha512-QinZRNovSTQcFuhRKxeHb22eFmyucbG96EPaQDSbz9qvIPxUhs1BZviNc8HAkHWYFqTSET/xZcEoHpm1DeDbRg==", + "dependencies": { + "@glideapps/ts-necessities": "2.1.3", + "@types/urijs": "^1.19.19", + "browser-or-node": "^2.1.1", + "collection-utils": "^1.0.1", + "cross-fetch": "^4.0.0", + "is-url": "^1.2.4", + "js-base64": "^3.7.5", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.4.2", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.3.1" + } + }, + "node_modules/ramda": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.1.tgz", + "integrity": "sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfc4648": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.3.tgz", + "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "peer": true + }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "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==", + "peer": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2d36f4d --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "ecr", + "version": "0.0.1", + "description": "Pepr module that creates ECR repositories to allow ECR to be used as an external Zarf registry", + "keywords": [ + "pepr", + "k8s", + "policy-engine", + "pepr-module", + "security" + ], + "engines": { + "node": ">=18.0.0" + }, + "pepr": { + "name": "ecr", + "uuid": "b95dbd80-e078-5eb9-aaf3-bcb9567417d0", + "onError": "ignore", + "alwaysIgnore": { + "namespaces": [], + "labels": [] + } + }, + "scripts": { + "build": "npx pepr build", + "unit-test": "jest --coverage" + }, + "dependencies": { + "@aws-sdk/client-ecr": "^3.408.0", + "@aws-sdk/client-ecr-public": "^3.413.0", + "pepr": "^0.15.0" + }, + "devDependencies": { + "@jest/globals": "^29.6.4", + "@types/jest": "^29.5.5", + "jest": "^29.6.4", + "ts-jest": "^29.1.1" + } +} diff --git a/packages/eks/eks.yaml b/packages/eks/eks.yaml new file mode 100644 index 0000000..e99a6ed --- /dev/null +++ b/packages/eks/eks.yaml @@ -0,0 +1,23 @@ +# eksctl create cluster --config-file=eks.yaml +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig +metadata: + name: "###ZARF_VAR_EKS_CLUSTER_NAME###" + region: "###ZARF_VAR_EKS_CLUSTER_REGION###" + version: "###ZARF_VAR_EKS_CLUSTER_VERSION###" + +iam: + withOIDC: true + +addons: + - name: aws-ebs-csi-driver + version: "###ZARF_VAR_EBS_DRIVER_VERSION###" + attachPolicyARNs: + - arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy + +managedNodeGroups: +- instanceType: "###ZARF_VAR_EKS_INSTANCE_TYPE###" + name: "###ZARF_VAR_EKS_CLUSTER_NAME###-ng" + minSize: 3 + maxSize: 6 + spot: true diff --git a/packages/eks/zarf.yaml b/packages/eks/zarf.yaml new file mode 100644 index 0000000..270eeba --- /dev/null +++ b/packages/eks/zarf.yaml @@ -0,0 +1,67 @@ +kind: ZarfPackageConfig +metadata: + name: distro-eks + description: Deploy a EKS K8s cluster + architecture: multi + version: 0.0.5 + +variables: + - name: EKS_CLUSTER_NAME + description: The name for the EKS cluster + prompt: true + + - name: EKS_INSTANCE_TYPE + description: The EC2 instance type for the worker nodes + default: t3.small + + - name: EKS_CLUSTER_REGION + description: The AWS region to setup the cluster and associated networking + default: us-west-2 + + - name: EKS_CLUSTER_VERSION + description: The Kubernetes version to use for the cluster + default: "1.27" + + - name: EBS_DRIVER_VERSION + description: The EBS driver version to use for the cluster (must be available on the K8s version) + default: "v1.24.0" + +components: + - name: load-eksctl + required: true + files: + - source: eks.yaml + target: eks.yaml + - source: https://github.com/weaveworks/eksctl/releases/download/v0.164.0/eksctl_Darwin_amd64.tar.gz + shasum: b94b7d782a7e808e5cf4822d6b959e3a3ca6289b7a6c9fb3259687e55813f11d + target: binaries/eksctl_Darwin_x86_64 + executable: true + extractPath: eksctl + - source: https://github.com/weaveworks/eksctl/releases/download/v0.164.0/eksctl_Darwin_arm64.tar.gz + shasum: 12e53b4e46bca9fc93b343de95db98388a93cc98f67916795854ae5d5dfae035 + target: binaries/eksctl_Darwin_arm64 + executable: true + extractPath: eksctl + - source: https://github.com/weaveworks/eksctl/releases/download/v0.164.0/eksctl_Linux_amd64.tar.gz + shasum: 9d0d94dd738d8bb39e95a0184e39f6b08c9e96804ea4a64e52d394000313b983 + target: binaries/eksctl_Linux_x86_64 + executable: true + extractPath: eksctl + + - name: deploy-eks-cluster + description: Create an EKS cluster! + actions: + onDeploy: + before: + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) create cluster --dry-run -f eks.yaml + - cmd: sleep 15 + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) create cluster -f eks.yaml + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) utils write-kubeconfig -c ${ZARF_VAR_EKS_CLUSTER_NAME} -r ${ZARF_VAR_EKS_CLUSTER_REGION} + onRemove: + before: + # NOTE: This onRemove action assumes the presence of an eksctl binary in a 'binaries' directory from where 'zarf package remove' was ran. + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) delete cluster -f eks.yaml --disable-nodegroup-eviction --wait + after: + # clean up after ourselves + - cmd: rm -rf binaries + - cmd: rm -f eks.yaml diff --git a/pepr.ts b/pepr.ts new file mode 100644 index 0000000..2c5838b --- /dev/null +++ b/pepr.ts @@ -0,0 +1,10 @@ +import { PeprModule } from "pepr"; +// cfg loads your pepr configuration from package.json +import cfg from "./package.json"; +import { ECRhook } from "./capabilities/webhook"; + +/** + * This is the main entrypoint for this Pepr module. It is run when the module is started. + * This is where you register your Pepr configurations and capabilities. + */ +new PeprModule(cfg, [ECRhook]); diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..2017ccb --- /dev/null +++ b/renovate.json @@ -0,0 +1,74 @@ +{ + "extends": [ + "config:base", + "group:allNonMajor" + ], + "ignoreDeps": [ + "sigs.k8s.io/kustomize/kyaml" + ], + "ignorePaths": [ + "**/node_modules/**", + "**/bower_components/**", + "**/vendor/**", + "**/__tests__/**", + "**/test/**", + "**/tests/**", + "**/__fixtures__/**" + ], + "packageRules": [ + { + "matchUpdateTypes": [ + "patch", + "pin", + "digest" + ], + "automerge": true, + "automergeType": "pr" + }, + { + "matchDepTypes": [ + "devDependencies" + ], + "automerge": true, + "automergeType": "pr" + } + ], + "platformAutomerge": true, + "platformCommit": true, + "postUpdateOptions": [ + "gomodTidy" + ], + "regexManagers": [ + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "charts:(.|\n)*?(^\\s{4}[\\w:]+|\n$|^\\s{2}-)", + "- name: (?.+)(.|\n)*?url: (?.+)(.|\n)*?version: (?.+)" + ], + "datasourceTemplate": "helm" + }, + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "# renovate: datasource=(?.*?) depName=(?.*?)( versioning=(?.*?))?( registryUrl=(?.*?))?\\s.*?version: (?.*)\\s" + ], + "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}" + }, + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "https:\\/\\/github.com\\/(?[\\w\\/\\-\\.\\+\\%]+?)\\/releases\\/download\\/(?[\\w\\/\\-\\.\\+\\%]+?)\\/" + ], + "datasourceTemplate": "github-releases" + } + ] +} diff --git a/revive.toml b/revive.toml new file mode 100644 index 0000000..ebda8f5 --- /dev/null +++ b/revive.toml @@ -0,0 +1,31 @@ +ignoreGeneratedHeader = false +severity = "warning" +confidence = 0.8 +errorCode = 0 +warningCode = 0 +formatter = "stylish" + +[rule.blank-imports] +[rule.context-as-argument] +[rule.context-keys-type] +[rule.dot-imports] +[rule.error-return] +[rule.error-strings] +[rule.error-naming] +[rule.exported] +[rule.if-return] +[rule.increment-decrement] +[rule.var-naming] +[rule.var-declaration] +[rule.package-comments] +[rule.range] +[rule.receiver-naming] +[rule.time-naming] +[rule.unexported-return] +[rule.indent-error-flow] +[rule.errorf] +[rule.empty-block] +[rule.superfluous-else] +[rule.unused-parameter] +[rule.unreachable-code] +[rule.redefines-builtin-id] diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..15058c1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "lib": [ + "ES2022" + ], + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "dist", + "resolveJsonModule": true, + "rootDir": ".", + "strict": false, + "target": "ES2022", + "useUnknownInCatchVariables": false + }, + "include": [ + "capabilities/*.ts" + ] +} diff --git a/types.go b/types.go new file mode 100644 index 0000000..f4c1d3c --- /dev/null +++ b/types.go @@ -0,0 +1,19 @@ +package main + +type dockerConfig struct { + Auths dockerConfigEntry `json:"auths"` +} + +type dockerConfigEntry map[string]dockerConfigEntryWithAuth + +type dockerConfigEntryWithAuth struct { + Auth string `json:"auth"` +} + +type registryInfo struct { + Address string `json:"address" jsonschema:"description=URL address of the registry"` +} + +type zarfState struct { + RegistryInfo registryInfo `json:"registryInfo" jsonschema:"description=Information about the container registry Zarf is configured to use"` +} diff --git a/zarf-config.example.yaml b/zarf-config.example.yaml new file mode 100644 index 0000000..98905df --- /dev/null +++ b/zarf-config.example.yaml @@ -0,0 +1,36 @@ +log_level: debug +architecture: amd64 + +package: + create: + set: + # The image reference to use for the Pepr controller + pepr_image_domain: ghcr.io + pepr_image: defenseunicorns/pepr/controller + pepr_image_tag: v0.15.0 + + # The image reference to use for the Zarf agent + agent_image_domain: ghcr.io/ + agent_image: defenseunicorns/zarf/agent + agent_image_tag: v0.31.0 + + # The image reference to use for the ECR credential helper, defaults to a locally built image + credential_helper_image_domain: ghcr.io/ + credential_helper_image: defenseunicorns/zarf-init-aws/ecr-credential-helper + credential_helper_image_tag: local + + # The image reference to use for the optional git-server Zarf deploys + gitea_image: gitea/gitea + gitea_server_version: 1.19.3 + + registry_image_domain: "" + registry_image: "" + registry_image_tag: "" + + deploy: + set: + aws_region: us-east-1 + registry_type: "" + ecr_hook_role_arn: "" + ecr_credential_helper_role_arn: "" + ecr_credential_helper_cron_schedule: "*/1 * * * *" diff --git a/zarf.yaml b/zarf.yaml new file mode 100644 index 0000000..d0a6012 --- /dev/null +++ b/zarf.yaml @@ -0,0 +1,92 @@ +kind: ZarfInitConfig +metadata: + name: init-aws + description: "Zarf Init Package that uses ECR as an external Zarf registry" + url: https://github.com/defenseunicorns/zarf-init-aws + +constants: + - name: PEPR_IMAGE + value: "###ZARF_PKG_TMPL_PEPR_IMAGE###" + - name: PEPR_IMAGE_TAG + value: "###ZARF_PKG_TMPL_PEPR_IMAGE_TAG###" + + - name: CREDENTIAL_HELPER_IMAGE + value: "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE###" + - name: CREDENTIAL_HELPER_IMAGE_TAG + value: "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###" + +variables: + - name: REGISTRY_TYPE + description: "Specify whether you want to use a private or public ECR registry" + prompt: true + + - name: AWS_REGION + description: "The AWS region the ECR registry is located in" + prompt: true + + - name: ECR_HOOK_ROLE_ARN + description: "The ARN of an IAM role to give Pepr necessary permissions to list and create ECR repositories" + prompt: true + + - name: ECR_CREDENTIAL_HELPER_ROLE_ARN + description: "The ARN of an IAM role to give the zarf-ecr-credential-helper necessary permissions to fetch ECR tokens" + prompt: true + + - name: ECR_CREDENTIAL_HELPER_CRON_SCHEDULE + description: "The schedule on which the ECR credential helper CronJob will run. https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-syntax" + # Run once an hour at the beginning of the hour + default: "0 * * * *" + +components: + - name: ecr-bootstrap + description: "Bootstrap the deployment by creating an ECR repository for the Pepr controller image" + required: true + files: + - source: hack/ecr.sh + target: hack/ecr.sh + executable: true + actions: + onDeploy: + after: + - cmd: ./hack/ecr.sh + description: "Create ECR repository for the Pepr controller image" + + - name: ecr-hook + description: "Pepr webhook that creates ECR repos for images during package deployments" + required: true + manifests: + - name: module + namespace: pepr-system + kustomizations: + - manifests + images: + - "###ZARF_PKG_TMPL_PEPR_IMAGE_DOMAIN###/###ZARF_PKG_TMPL_PEPR_IMAGE###:###ZARF_PKG_TMPL_PEPR_IMAGE_TAG###" + + - name: zarf-agent + required: true + import: + url: oci://ghcr.io/defenseunicorns/packages/init:v0.31.0-skeleton + name: zarf-agent + + - name: zarf-ecr-credential-helper + description: "CronJob that updates Zarf image pull secrets with new ECR tokens" + manifests: + - name: zarf-ecr-credential-helper + namespace: zarf + files: + - manifests/zarf-ecr-credential-helper.yaml + actions: + onCreate: + before: + - cmd: "test \"###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###\" != \"local\" || make build-local-credential-helper-image CREDENTIAL_HELPER_IMAGE_TAG=\"###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###\" ARCH=\"###ZARF_PKG_ARCH###\"" + shell: + windows: pwsh + description: Build the local ECR credential helper image (if 'CREDENTIAL_HELPER_IMAGE_TAG' was specified as 'local') + images: + - "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_DOMAIN######ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE###:###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###" + + # (Optional) Adds a git server to the cluster + - name: git-server + import: + url: oci://ghcr.io/defenseunicorns/packages/init:v0.31.0-skeleton + name: git-server